помощь в разработке движка
redinard Дата: Четверг, 04 Октября 2012, 01:02 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Всем привет,я начал разработку собственного движка для написания курсовой работы и для дальнейшего его развития,всё ишло гладко до недавна пока я не нарвался на такую проблемму,которую можете увидеть сами,вот код: render.h Code
#pragma comment(lib, "winmm.lib") #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include <windows.h> #include "d3d9.h" #include <d3dx9.h> #include <mmsystem.h>//заголовочный файл для работы с системными функциями //*********************************************************** LPDIRECT3D9 g_pD3D = NULL; //объявление главного объекта LPDIRECT3DDEVICE9 pDirect3DDevice; //объявление девайса LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; //объявление вертекс буффера LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер void Matrix(); struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z, rhw;//координаты вершины DWORD color; //цвет вершыны }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)//формат содержания вершин /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // ИНИЦИАЛИЗАЦИЯ Direct3D // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitD3D(HWND hwnd) { if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) //создаётся основной указатель на интерфейс IDirect3D9 return E_FAIL; D3DDISPLAYMODE Disp; //структура для соответствия текущих установок дисплея if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Disp))) //получаем текущий формат дисплея return E_FAIL; //параметры показа D3DPRESENT_PARAMETERS d3dpp; //обект параметров представления Direct3DParametr ZeroMemory(&d3dpp, sizeof(d3dpp)); //очищает создаваемую структуру от мусора d3dpp.Windowed = true; //видеорежим используемый нашим приложением d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //параметр опредиления размеров буфера d3dpp.BackBufferFormat = Disp.Format; //формат поверхности заднего буфера d3dpp.EnableAutoDepthStencil = true;//значение показывающее возможность создания Z буфера d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности Z буфера //создание девайса if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);//отключить отсечение pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);//отключить освещение Direct3D pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);//включаем Z буфер return S_OK; } /////////////////////////////////////////////////////////////////////////////////////////////////// void RenderD3D() { if(pDirect3DDevice==NULL) return; pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0); //цвет фона pDirect3DDevice->BeginScene(); //начало сцены Matrix(); //здесь происходит отрисовка сцены pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX)); //Установка формата вершин pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12); pDirect3DDevice->EndScene(); //конец сцены pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitVertBuff() { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { { 1.0f,-1.0f, 1.0f, 0x00000fff, }, //А { -1.0f,-1.0f, 1.0f, 0xff000fff, }, //В { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //С { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //C { 1.0f, 1.0f, 1.0f, 0xff000fff, }, //D { 1.0f,-1.0f, 1.0f, 0x00000fff, }, //A { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //А2 { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //В2 { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //С2 { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //C2 { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //D2 { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //A2 { 1.0f,-1.0f,-1.0f, 0xfff00000, }, //А3 { -1.0f,-1.0f,-1.0f, 0xfff00000, }, //В3 { -1.0f, 1.0f,-1.0f, 0xfff00000, }, //С3 { -1.0f, 1.0f,-1.0f, 0xfff00000, }, //C3 { 1.0f, 1.0f,-1.0f, 0xfff00000, }, //D3 { 1.0f,-1.0f,-1.0f, 0xfff00000, }, //A3 { 1.0f,-1.0f,-1.0f, 0x0000ffff, }, //А4 { 1.0f,-1.0f, 1.0f, 0x0000ffff, }, //В4 { 1.0f, 1.0f, 1.0f, 0x0000ffff, }, //С4 { 1.0f, 1.0f, 1.0f, 0x0000ffff, }, //C4 { 1.0f, 1.0f,-1.0f, 0x0000ffff, }, //D4 { 1.0f,-1.0f,-1.0f, 0x0000ffff, }, //A4 { 1.0f, 1.0f, 1.0f, 0x00000fff, }, //А5 { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //В5 { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //С5 { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //C5 { 1.0f, 1.0f,-1.0f, 0x00000fff, }, //D5 { 1.0f, 1.0f, 1.0f, 0x00000fff, }, //A5 { 1.0f,-1.0f, 1.0f, 0x00000fff, }, //А6 { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //В6 { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //С6 { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //C6 { 1.0f,-1.0f,-1.0f, 0x00000fff, }, //D6 { 1.0f,-1.0f, 1.0f, 0x00000fff, }, //A6 }; const unsigned short Index[]={ 0,1,2, 2,3,0, 4,5,6, 6,7,4, 8,9,10, 10,11,8, 12,13,14, 14,15,12, 16,17,18, 18,19,16, 20,21,22, 22,23,20, }; // | - кол-во вершин прямо пропорционально числу перед sizeof if(FAILED(pDirect3DDevice->CreateVertexBuffer( 36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVertBuff, NULL))) return E_FAIL; void *pVB; //временный указатель на указатель вертекс буфера if(FAILED(pVertBuff->Lock(0, sizeof(Vertex), (void**)&pVB, 0))) //Блоктровка буфера return E_FAIL; memcpy(pVB, Vertex, sizeof(Vertex)); //копирование данных pVertBuff->Unlock(); //Разблокировка буфера return S_OK; } ///////////////////////////////////////////////// VOID Matrix() { D3DXMATRIX MatrixWorld,MatrixWorldX;//мировая матрица D3DXMATRIX MatrixWorldY,MatrixWorldZ; D3DXMATRIX MatrixView;//матрица вида D3DXMATRIX MatrixProjection;//матрица прекции //мировая матрица UINT Time = timeGetTime()% 5000; FLOAT Angle = Time*(2.0f * D3DX_PI)/5000.0f; D3DXMatrixRotationY(&MatrixWorldY,Angle); D3DXMatrixRotationX(&MatrixWorldX,Angle); D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY); pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld); //матрица вида D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.f), &D3DXVECTOR3(0.0f,0.0f,0.0f), &D3DXVECTOR3(0.0f,1.0f,0.0f)); pDirect3DDevice->SetTransform( D3DTS_VIEW, &MatrixView ); D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4,1.0f,1.0f,100.0f); //матрица проекции pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void FreeD3D()//функция освобождает захваченные ресурсы { if(pVertBuff != NULL) pVertBuff->Release(); if(pDirect3DDevice != NULL) pDirect3DDevice->Release(); if(g_pD3D != NULL) g_pD3D->Release(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) //здесь происходит обработка сообщений { switch(msg) { case WM_DESTROY: FreeD3D(); //функция освобождния захваченых ресурсов PostQuitMessage(0); break; } return (DefWindowProc(hwnd, msg, wparam, lparam)); }
window.cpp Code
#include "render.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)//ГЛАВНАЯ ФУНКЦИЯ { WNDCLASSEX wc; //создание класса окна HWND hwnd; //создаём дискриптор окна MSG msg; //идентификатор сообщения ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// wc.cbSize = sizeof(WNDCLASSEX); // Размер всей структуры wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS; //Задание стиля окн wc.lpfnWndProc = WndProc; //Наша функция обработки событий wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; //Экземпляр приложения wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //цвет фона wc.lpszMenuName = NULL; //имя меню wc.lpszClassName = L"TEST_WIN32"; //Имя класса окна wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Регистрация созданного класса RegisterClassEx(&wc); // Иконка в заголовке окна ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Создание окна if(!(hwnd = CreateWindowEx( NULL, L"TEST_WIN32", //Имя класса окна L"База для DirectX", // Заголовок окна WS_OVERLAPPEDWINDOW | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, // Координаты левого верхнего угла 800, // Ширина окна 600, // Высота окна NULL, // Дескриптор родительского окна NULL, // Дескриптор меню hInstance, // Экземпляр NULL))) // Дополнительные параметры return 0; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// if(SUCCEEDED(InitD3D(hwnd))) { if(SUCCEEDED(InitVertBuff())) { ShowWindow(hwnd, nCmdShow); // Вывод окна UpdateWindow(hwnd); // Апдейт окна ZeroMemory(&msg, sizeof(msg)); while(msg.message != WM_QUIT) { if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); // преобразование клав. ввода DispatchMessage(&msg); // обработка и пересылка сообщ. в WinProc } else RenderD3D(); //РЕНДЕР } } } return 0; //(int)(msg.wParam); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////
подскажите где я допустил ошибку
Я белый и пушистый но имею когти и зубы
Archido Дата: Четверг, 04 Октября 2012, 11:41 | Сообщение # 2
Сэнсэй
Сейчас нет на сайте
Проблема в криво отрисовывающихся сторонах бокса? Если да, то проблема в порядке обхода вершин (в индексном буфере). Можно отключить Back Face Culling, сделав:Code
pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
тогда все отрисуется нормально. По умолчанию (и сейчас в коде) стоит D3DCULL_ССW, поэтому чтобы правильно все отрисовать нужно обходить вершины по часовой стрелке (для каждого треугольника).
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Четверг, 04 Октября 2012, 11:42
redinard Дата: Четверг, 04 Октября 2012, 12:29 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
так я просто отключу отсечение,а уменя проблемма заключается в том что осекаются лицевые грани вместо тыльных
Я белый и пушистый но имею когти и зубы
Archido Дата: Четверг, 04 Октября 2012, 12:55 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
Так я и говорю - правильно обходить вершины нужно (в индексном буфере порядок вершин изменить). Собственно, D3DCULL_ССW говорит, что лицевые грани - это такие, у которых обход вершин сделан по часовой стрелке... А сейчас одна часть сделана по часовой, другая против часовой - вот кулинг нормально и не работает. Добавлено (04.10.2012, 12:55) --------------------------------------------- А, сейчас посмотрел - индексы при отрисовке вообще не используются, тогда нужно просто изменить порядок вершин в массиве.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Четверг, 04 Октября 2012, 13:14
redinard Дата: Четверг, 04 Октября 2012, 13:18 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
можите пожалуйста показать как это правильно сделать,потому что я делаю практичесски 1 в 1 как в книге Горнакова,но вот результатДобавлено (04.10.2012, 13:18) --------------------------------------------- хотя я сам приметив писал не так как в книге,пожскажите правельный индекс буфер к нему,так как проект я начал давно и на лето забросил,а теперь толком не помню что к чему
Я белый и пушистый но имею когти и зубы
Archido Дата: Четверг, 04 Октября 2012, 13:28 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Сейчас у вас все рисуется без индекс буфера, хоть и определение его есть. Поэтому нужно изменить порядок следования вершин в их же массиве, как-то так: Code
HRESULT InitVertBuff() { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { { 1.0f,-1.0f, 1.0f, 0x00ff00ff, }, //А { -1.0f, 1.0f, 1.0f, 0x00ff00ff, }, //С { -1.0f,-1.0f, 1.0f, 0x00ff00ff, }, //В { -1.0f, 1.0f, 1.0f, 0x00ff00ff, }, //C { 1.0f,-1.0f, 1.0f, 0x00ff00ff, }, //A { 1.0f, 1.0f, 1.0f, 0x00ff00ff, }, //D { -1.0f,-1.0f, 1.0f, 0x000000ff, }, //А2 { -1.0f, 1.0f,-1.0f, 0x000000ff, }, //С2 { -1.0f,-1.0f,-1.0f, 0x000000ff, }, //В2 { -1.0f, 1.0f,-1.0f, 0x000000ff, }, //C2 { -1.0f,-1.0f, 1.0f, 0x000000ff, }, //A2 { -1.0f, 1.0f, 1.0f, 0x000000ff, }, //D2 { 1.0f,-1.0f,-1.0f, 0xffffff00, }, //А3 { -1.0f,-1.0f,-1.0f, 0xffffff00, }, //В3 { -1.0f, 1.0f,-1.0f, 0xffffff00, }, //С3 { -1.0f, 1.0f,-1.0f, 0xffffff00, }, //C3 { 1.0f, 1.0f,-1.0f, 0xffffff00, }, //D3 { 1.0f,-1.0f,-1.0f, 0xffffff00, }, //A3 { 1.0f,-1.0f,-1.0f, 0x00ff0000, }, //А4 { 1.0f, 1.0f, 1.0f, 0x00ff0000, }, //С4 { 1.0f,-1.0f, 1.0f, 0x00ff0000, }, //В4 { 1.0f, 1.0f, 1.0f, 0x00ff0000, }, //C4 { 1.0f,-1.0f,-1.0f, 0x00ff0000, }, //A4 { 1.0f, 1.0f,-1.0f, 0x00ff0000, }, //D4 { 1.0f, 1.0f, 1.0f, 0x00000fff, }, //А5 { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //С5 { -1.0f, 1.0f, 1.0f, 0x00000fff, }, //В5 { -1.0f, 1.0f,-1.0f, 0x00000fff, }, //C5 { 1.0f, 1.0f, 1.0f, 0x00000fff, }, //A5 { 1.0f, 1.0f,-1.0f, 0x00000fff, }, //D5 { 1.0f,-1.0f, 1.0f, 0x00000fff, }, //А6 { -1.0f,-1.0f, 1.0f, 0x00000fff, }, //В6 { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //С6 { -1.0f,-1.0f,-1.0f, 0x00000fff, }, //C6 { 1.0f,-1.0f,-1.0f, 0x00000fff, }, //D6 { 1.0f,-1.0f, 1.0f, 0x00000fff, }, //A6 };
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Четверг, 04 Октября 2012, 13:29
redinard Дата: Вторник, 09 Октября 2012, 13:51 | Сообщение # 7
постоянный участник
Сейчас нет на сайте
ОГРОМНОЕ СПАСИБО !!!Добавлено (09.10.2012, 13:51) --------------------------------------------- народ,помогите исправить ошибки,я всю пару пропарился и несмог понять как их исправить
Code
#pragma comment(lib, "winmm.lib") #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include <windows.h> #include "d3d9.h" #include <d3dx9.h> #include <d3dx9core.h> #include <mmsystem.h>//заголовочный файл для работы с системными функциями //*********************************************************** LPDIRECT3D9 g_pD3D = NULL; //объявление главного объекта LPDIRECT3DDEVICE9 pDirect3DDevice; //объявление девайса LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; //объявление вертекс буффера LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер LPD3DXFONT pFont = NULL; RECT Rec; HFONT hFont; void LightMaterial(); void Matrix(); struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z;//координаты вершины float nx,ny,nz; //нормали }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//формат содержания вершин /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // ИНИЦИАЛИЗАЦИЯ Direct3D // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitD3D(HWND hwnd) { if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) //создаётся основной указатель на интерфейс IDirect3D9 return E_FAIL; D3DDISPLAYMODE Disp; //структура для соответствия текущих установок дисплея if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Disp))) //получаем текущий формат дисплея return E_FAIL; //параметры показа D3DPRESENT_PARAMETERS d3dpp; //обект параметров представления Direct3DParametr ZeroMemory(&d3dpp, sizeof(d3dpp)); //очищает создаваемую структуру от мусора d3dpp.Windowed = false; //видеорежим используемый нашим приложением d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //параметр опредиления размеров буфера d3dpp.BackBufferFormat = Disp.Format; //формат поверхности заднего буфера d3dpp.EnableAutoDepthStencil = true;//значение показывающее возможность создания Z буфера d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности Z буфера d3dpp.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);//берём размер разрешения экрана и передаём параметрам d3dpp.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);// d3dpp.BackBufferCount = 3;// кол-во заданных буферов d3dpp.FullScreen_RefreshRateInHz = Disp.RefreshRate;//частта обновления экрана //создание девайса if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);//отключить отсечение pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);//отключить освещение Direct3D pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);//включаем Z буфер return S_OK; } /////////////////////////////////////////////////////////////////////////////////////////////////// void RenderD3D() { if(pDirect3DDevice==NULL) return; pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0); //цвет фона pDirect3DDevice->BeginScene(); //начало сцены //здесь происходит отрисовка сцены Matrix(); LightMaterial(); //здесь происходит отрисовка сцены pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX)); //Установка формата вершин pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice->SetIndices(pBufferIndex); pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12); //вывод обекта //вывод текаста DrawMyText(pDirect3DDevice, hFont, "Текст в DirectX", 10,10,500,700,D3DCOLOR_ARGB(250,250,250,50)); pDirect3DDevice->EndScene(); //конец сцены pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitVertBuff() //internalObject { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { { 1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //А { -1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //С { -1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //В { -1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f}, //C { 1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //A { 1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //D { -1.0f,-1.0f, 1.0f, -1.0f,0.0f,0.0f }, //А2 { -1.0f, 1.0f,-1.0f, -1.0f,0.0f,0.0f }, //С2 { -1.0f,-1.0f,-1.0f, -1.0f,0.0f,0.0f }, //В2 { -1.0f, 1.0f,-1.0f, -1.0f,0.0f,0.0f }, //C2 { -1.0f,-1.0f, 1.0f, -1.0f,0.0f,0.0f }, //A2 { -1.0f, 1.0f, 1.0f, -1.0f,0.0f,0.0f }, //D2 { 1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //А3 { -1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //В3 { -1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f}, //С3 { -1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f }, //C3 { 1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f }, //D3 { 1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //A3 { 1.0f,-1.0f,-1.0f, 1.0f,0.0f,0.0f }, //А4 { 1.0f, 1.0f, 1.0f, 1.0f,0.0f,0.0f }, //С4 { 1.0f,-1.0f, 1.0f, 1.0f,0.0f,0.0f }, //В4 { 1.0f, 1.0f, 1.0f, 1.0f,0.0f,0.0f}, //C4 { 1.0f,-1.0f,-1.0f, 1.0f,0.0f,0.0f }, //A4 { 1.0f, 1.0f,-1.0f, 1.0f,0.0f,0.0f}, //D4 { 1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f }, //А5 { -1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f }, //С5 { -1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f}, //В5 { -1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f }, //C5 { 1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f }, //A5 { 1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f}, //D5 { 1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f }, //А6 { -1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f}, //В6 { -1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f}, //С6 { -1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f }, //C6 { 1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f }, //D6 { 1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f }, //A6 }; const unsigned short Index[]={ 0,1,2, 2,3,0, 4,5,6, 6,7,4, 8,9,10, 10,11,8, 12,13,14, 14,15,12, 16,17,18, 18,19,16, 20,21,22, 22,23,20, }; // | - кол-во вершин прямо пропорционально числу перед sizeof if(FAILED(pDirect3DDevice->CreateVertexBuffer( 36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVertBuff, NULL))) return E_FAIL; void *pVB; //временный указатель на указатель вертекс буфера if(FAILED(pVertBuff->Lock(0, sizeof(Vertex), (void**)&pVB, 0))) //Блоктровка буфера return E_FAIL; memcpy(pVB, Vertex, sizeof(Vertex)); //копирование данных pVertBuff->Unlock(); //Разблокировка буфера return S_OK; } ///////////////////////////////////////////////// VOID Matrix() { D3DXMATRIX MatrixWorld,MatrixWorldX;//мировая матрица D3DXMATRIX MatrixWorldY,MatrixWorldZ; D3DXMATRIX MatrixView;//матрица вида D3DXMATRIX MatrixProjection;//матрица прекции //мировая матрица UINT Time = timeGetTime()% 5000; FLOAT Angle = Time*(2.0f * D3DX_PI)/5000.0f; D3DXMatrixRotationY(&MatrixWorldY,Angle); D3DXMatrixRotationX(&MatrixWorldX,Angle); D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY); pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld); //матрица вида D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.f), &D3DXVECTOR3(0.0f,0.0f,0.0f), &D3DXVECTOR3(0.0f,1.0f,0.0f)); pDirect3DDevice->SetTransform( D3DTS_VIEW, &MatrixView ); D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4,1.0f,1.0f,100.0f); //матрица проекции pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // функция DrawMyText() // вывод текста на экран // // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont, char* StrokaTexta,int x,int y,int x1, int y1,D3DCOLOR MyColor) { //создаём шрифт hFont = CreateFont(30, 10, 0, 0,FW_NORMAL,FALSE,FALSE,0,1,0, 0, 0, DEFAULT_PITCH|FF_MODERN, "Arial"); //координаты прямоугольника Rec.left = x; Rec.top = y; Rec.right = x1; Rec.bottom = y1; //инициализируем шрифт D3DXCreateFont(pDirect3DDevice, hFont, &pFont); //начало pFont -> Begin(); //вывод текста pFont -> DrawText(StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor); //конец pFont ->End(); } VOID LightMaterial() { D3DMATERIAL9 Material; //материал D3DLIGHT9 Light; //свет //установим материал ZeroMemory(&Material,sizeof(D3DMATERIAL9)); Material.Diffuse.r = Material.Ambient.r = 1.0f; Material.Diffuse.g = Material.Ambient.g = 1.0f; Material.Diffuse.b = Material.Ambient.b = 0.0f; Material.Diffuse.a = Material.Ambient.a = 1.0f; pDirect3DDevice-> SetMaterial(&Material); D3DXVECTOR3 VectorDir; //установим свет ZeroMemory(&Light,sizeof(D3DLIGHT9)); Light.Type = D3DLIGHT_DIRECTIONAL; Light.Diffuse.r = 1.0f; Light.Diffuse.g = 1.0f; Light.Diffuse.b = 1.0f; Light.Range = 1000.f; //установим нормаль VectorDir = D3DXVECTOR3(0.0f,0.0f,1.0f), D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction,&VectorDir); pDirect3DDevice -> SetLight(0,&Light); pDirect3DDevice -> LightEnable(0,TRUE); pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING,TRUE); pDirect3DDevice -> SetRenderState(D3DRS_AMBIENT,0); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void FreeD3D()//функция освобождает захваченные ресурсы { if(pVertBuff != NULL) pVertBuff->Release(); if(pDirect3DDevice != NULL) pDirect3DDevice->Release(); if(g_pD3D != NULL) g_pD3D->Release(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) //здесь происходит обработка сообщений { switch(msg) { { case WM_DESTROY: FreeD3D(); //функция освобождния захваченых ресурсов PostQuitMessage(0); break; } case WM_KEYDOWN: { if(wparam == VK_ESCAPE) PostQuitMessage(0); return 0; } } return (DefWindowProc(hwnd, msg, wparam, lparam)); }
Я белый и пушистый но имею когти и зубы
Archido Дата: Вторник, 09 Октября 2012, 14:39 | Сообщение # 8
Сэнсэй
Сейчас нет на сайте
Копипаст из книжек? Нужно самому разбираться. В первую очередь нужно вынести бОльшую часть кода из заголовочника (.h) в .cpp, в .h файле оставить только объявления ф-ций, глобальные переменные, классы (описание вершин, например), все остальное писать в .cpp. Другие проблемы связаны с тем, что в старых книгах по DX9 использовался и старый SDK, сейчас там кое-что поменялось... Конкретно в этом коде проблемы с шрифтами, нужно чутка переделать на новый лад, гугл знает на какой
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinard Дата: Вторник, 09 Октября 2012, 15:26 | Сообщение # 9
постоянный участник
Сейчас нет на сайте
да действительно я сейчас копирую код,но попутно в нём пытаюсь разобратся,когда я доберусь до конца книги,я буду преобразовывать этот код в движок,но пока что мне надо хотябы переписать его и убедится что он работаетДобавлено (09.10.2012, 15:26) --------------------------------------------- никак не могу найти корректное решение это проблеммы
Я белый и пушистый но имею когти и зубы
Archido Дата: Вторник, 09 Октября 2012, 15:38 | Сообщение # 10
Сэнсэй
Сейчас нет на сайте
Какой именно? Давайте конкретнее. В двух словах я написал, что неплохо бы сделать. Первом делом можно закоментировать все, что касается работы с текстом и исправить проблему с определением функции DrawMyText (сделать Render.h и Render.cpp, основной код писать в последнем), далее уже можно погуглить про текст и ID3DXFont и сделать необходимые правки в коде, т.к. копипастом из книги оно работать не будет (в данном случае).
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Вторник, 09 Октября 2012, 15:38
redinard Дата: Вторник, 09 Октября 2012, 15:42 | Сообщение # 11
постоянный участник
Сейчас нет на сайте
Quote
error C2660: DrawMyText: функция не принимает 8 аргументов
почему ?
Я белый и пушистый но имею когти и зубы
Archido Дата: Вторник, 09 Октября 2012, 16:27 | Сообщение # 12
Сэнсэй
Сейчас нет на сайте
Понятия не имею В том коде, который выше был приведен, с этим проблем нет... зато есть другие. Если пишет, что не принимает столько-то аргументов, значит неверное их-кол во указывается при вызове ф-ции. Точно такой же год?
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinard Дата: Вторник, 09 Октября 2012, 16:59 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
вот код:
#pragma comment(lib, "winmm.lib") #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include <windows.h> #include "d3d9.h" #include <d3dx9.h> #include <d3dx9core.h> #include <mmsystem.h>//заголовочный файл для работы с системными функциями //*********************************************************** LPDIRECT3D9 g_pD3D = NULL; //объявление главного объекта LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; //объявление девайса LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; //объявление вертекс буффера LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер LPD3DXFONT pFont = NULL; RECT Rec; HFONT hFont; void DrawMyText(); void LightMaterial(); void Matrix(); struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z;//координаты вершины float nx,ny,nz; //нормали }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)//формат содержания вершин /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // ИНИЦИАЛИЗАЦИЯ Direct3D // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitD3D(HWND hwnd) { if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) //создаётся основной указатель на интерфейс IDirect3D9 return E_FAIL; D3DDISPLAYMODE Disp; //структура для соответствия текущих установок дисплея if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Disp))) //получаем текущий формат дисплея return E_FAIL; //параметры показа D3DPRESENT_PARAMETERS d3dpp; //обект параметров представления Direct3DParametr ZeroMemory(&d3dpp, sizeof(d3dpp)); //очищает создаваемую структуру от мусора d3dpp.Windowed = false; //видеорежим используемый нашим приложением d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; //параметр опредиления размеров буфера d3dpp.BackBufferFormat = Disp.Format; //формат поверхности заднего буфера d3dpp.EnableAutoDepthStencil = true;//значение показывающее возможность создания Z буфера d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности Z буфера d3dpp.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);//берём размер разрешения экрана и передаём параметрам d3dpp.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN);// d3dpp.BackBufferCount = 3;// кол-во заданных буферов d3dpp.FullScreen_RefreshRateInHz = Disp.RefreshRate;//частта обновления экрана //создание девайса if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);//отключить отсечение pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);//отключить освещение Direct3D pDirect3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);//включаем Z буфер return S_OK; } /////////////////////////////////////////////////////////////////////////////////////////////////// void RenderD3D() { if(pDirect3DDevice==NULL) return; pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0); //цвет фона pDirect3DDevice->BeginScene(); //начало сцены //здесь происходит отрисовка сцены Matrix(); LightMaterial(); //здесь происходит отрисовка сцены pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX)); //Установка формата вершин pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice->SetIndices(pBufferIndex); pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12); //вывод объекта //вывод текаста DrawMyText(pDirect3DDevice,hFont,L"основа DirectX ",10,10,500,700,D3DCOLOR_ARGB(250,250,250,50)); pDirect3DDevice->EndScene(); //конец сцены pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitVertBuff() //internalObject { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { { 1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //А { -1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //С { -1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //В { -1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f}, //C { 1.0f,-1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //A { 1.0f, 1.0f, 1.0f, 0.0f,0.0f,-1.0f }, //D { -1.0f,-1.0f, 1.0f, -1.0f,0.0f,0.0f }, //А2 { -1.0f, 1.0f,-1.0f, -1.0f,0.0f,0.0f }, //С2 { -1.0f,-1.0f,-1.0f, -1.0f,0.0f,0.0f }, //В2 { -1.0f, 1.0f,-1.0f, -1.0f,0.0f,0.0f }, //C2 { -1.0f,-1.0f, 1.0f, -1.0f,0.0f,0.0f }, //A2 { -1.0f, 1.0f, 1.0f, -1.0f,0.0f,0.0f }, //D2 { 1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //А3 { -1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //В3 { -1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f}, //С3 { -1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f }, //C3 { 1.0f, 1.0f,-1.0f, 0.0f,0.0f,1.0f }, //D3 { 1.0f,-1.0f,-1.0f, 0.0f,0.0f,1.0f }, //A3 { 1.0f,-1.0f,-1.0f, 1.0f,0.0f,0.0f }, //А4 { 1.0f, 1.0f, 1.0f, 1.0f,0.0f,0.0f }, //С4 { 1.0f,-1.0f, 1.0f, 1.0f,0.0f,0.0f }, //В4 { 1.0f, 1.0f, 1.0f, 1.0f,0.0f,0.0f}, //C4 { 1.0f,-1.0f,-1.0f, 1.0f,0.0f,0.0f }, //A4 { 1.0f, 1.0f,-1.0f, 1.0f,0.0f,0.0f}, //D4 { 1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f }, //А5 { -1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f }, //С5 { -1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f}, //В5 { -1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f }, //C5 { 1.0f, 1.0f, 1.0f, 0.0f,-1.0f,0.0f }, //A5 { 1.0f, 1.0f,-1.0f, 0.0f,-1.0f,0.0f}, //D5 { 1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f }, //А6 { -1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f}, //В6 { -1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f}, //С6 { -1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f }, //C6 { 1.0f,-1.0f,-1.0f, 0.0f,1.0f,0.0f }, //D6 { 1.0f,-1.0f, 1.0f, 0.0f,1.0f,0.0f }, //A6 }; const unsigned short Index[]={ 0,1,2, 2,3,0, 4,5,6, 6,7,4, 8,9,10, 10,11,8, 12,13,14, 14,15,12, 16,17,18, 18,19,16, 20,21,22, 22,23,20, }; // | - кол-во вершин прямо пропорционально числу перед sizeof if(FAILED(pDirect3DDevice->CreateVertexBuffer( 36*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pVertBuff, NULL))) return E_FAIL; void *pVB; //временный указатель на указатель вертекс буфера if(FAILED(pVertBuff->Lock(0, sizeof(Vertex), (void**)&pVB, 0))) //Блоктровка буфера return E_FAIL; memcpy(pVB, Vertex, sizeof(Vertex)); //копирование данных pVertBuff->Unlock(); //Разблокировка буфера return S_OK; } ///////////////////////////////////////////////// VOID Matrix() { D3DXMATRIX MatrixWorld,MatrixWorldX;//мировая матрица D3DXMATRIX MatrixWorldY,MatrixWorldZ; D3DXMATRIX MatrixView;//матрица вида D3DXMATRIX MatrixProjection;//матрица прекции //мировая матрица UINT Time = timeGetTime()% 5000; FLOAT Angle = Time*(2.0f * D3DX_PI)/5000.0f; D3DXMatrixRotationY(&MatrixWorldY,Angle); D3DXMatrixRotationX(&MatrixWorldX,Angle); D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY); pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld); //матрица вида D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.f), &D3DXVECTOR3(0.0f,0.0f,0.0f), &D3DXVECTOR3(0.0f,1.0f,0.0f)); pDirect3DDevice->SetTransform( D3DTS_VIEW, &MatrixView ); D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4,1.0f,1.0f,100.0f); //матрица проекции pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // функция DrawMyText() // вывод текста на экран // // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont, char* StrokaTexta,int x,int y,int x1, int y1,D3DCOLOR MyColor) { //создаём шрифт hFont = CreateFont(30, 10, 0, 0,FW_NORMAL,FALSE,FALSE,0,1,0, 0, 0, DEFAULT_PITCH|FF_MODERN, L"Arial"); //координаты прямоугольника Rec.left = x; Rec.top = y; Rec.right = x1; Rec.bottom = y1; //инициализируем шрифт D3DXCreateFont(pDirect3DDevice, hFont, &pFont); //начало pFont -> Begin(); //вывод текста pFont -> DrawText(StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor); //конец pFont -> End(); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // LightMaterial() // Функция реализации света и материала // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// VOID LightMaterial() { D3DMATERIAL9 Material; //материал D3DLIGHT9 Light; //свет //установим материал ZeroMemory(&Material,sizeof(D3DMATERIAL9)); Material.Diffuse.r = Material.Ambient.r = 1.0f; Material.Diffuse.g = Material.Ambient.g = 1.0f; Material.Diffuse.b = Material.Ambient.b = 0.0f; Material.Diffuse.a = Material.Ambient.a = 1.0f; pDirect3DDevice-> SetMaterial(&Material); D3DXVECTOR3 VectorDir; //установим свет ZeroMemory(&Light,sizeof(D3DLIGHT9)); Light.Type = D3DLIGHT_DIRECTIONAL; Light.Diffuse.r = 1.0f; Light.Diffuse.g = 1.0f; Light.Diffuse.b = 1.0f; Light.Range = 1000.f; //установим нормаль VectorDir = D3DXVECTOR3(0.0f,0.0f,1.0f), D3DXVec3Normalize((D3DXVECTOR3*)&Light.Direction,&VectorDir); pDirect3DDevice -> SetLight(0,&Light); pDirect3DDevice -> LightEnable(0,TRUE); pDirect3DDevice -> SetRenderState(D3DRS_LIGHTING,TRUE); pDirect3DDevice -> SetRenderState(D3DRS_AMBIENT,0); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void FreeD3D()//функция освобождает захваченные ресурсы { if(pVertBuff != NULL) pVertBuff->Release(); if(pDirect3DDevice != NULL) pDirect3DDevice->Release(); if(g_pD3D != NULL) g_pD3D->Release(); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) //здесь происходит обработка сообщений { switch(msg) { { case WM_DESTROY: FreeD3D(); //функция освобождния захваченых ресурсов PostQuitMessage(0); break; } case WM_KEYDOWN: { if(wparam == VK_ESCAPE) PostQuitMessage(0); return 0; } } return (DefWindowProc(hwnd, msg, wparam, lparam)); }
Я белый и пушистый но имею когти и зубы
Archido Дата: Вторник, 09 Октября 2012, 17:12 | Сообщение # 14
Сэнсэй
Сейчас нет на сайте
Эм, почему ф-ция DrawMyText() объявляется без параметров, а ее реализация уже с параметрами? Должно быть одинаково и там и там. С++ вообще на каком уровне знаете?
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinard Дата: Вторник, 09 Октября 2012, 17:57 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
на базвом,год обучался в универе,просто как было сказано ранее пока я просто копипастю,да и подзабыл слегка язык за лето )Добавлено (09.10.2012, 17:57) --------------------------------------------- нашол в нэте вот такое решение
Code
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont, char* StrokaTexta,int x,int y,int x1,int y1,D3DCOLOR MyColor) { MyColor = D3DCOLOR_ARGB(250,250,250,50); // Создаем шрифт D3DXCreateFont(pDirect3DDevice,30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,"Arial",&pFont); // Координаты прямоугольника Rec.left = x; Rec.top = y; Rec.right = x1; Rec.bottom = y1; // Вывод текста pFont->DrawText(NULL,StrokaTexta, -1, &Rec, DT_WORDBREAK, MyColor); // удаляем pFont->Release(); } VOID RenderingDirect3D() { if(pDirect3DDevice == NULL) // Проверяем ошибки return; pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0 ); // Начало сцены pDirect3DDevice->BeginScene(); // Здесь происходит прорисовка сцены LightMaterial(); Matrix(); pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) ); pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); pDirect3DDevice->SetIndices(pBufferIndex); // Вывод объекта pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12); // Вывод текста DrawMyText(pDirect3DDevice,hFont,"Лаб. раб. №3\nВращение куба\nДля выхода нажмите клавишу <Esc> ",10,10,500,700,D3DCOLOR_ARGB(250,250,250,50)); // Конец сцены pDirect3DDevice->EndScene(); // Представляем на экран pDirect3DDevice->Present( NULL, NULL, NULL, NULL ); }
только осталась одна ошибка Quote
error C2660: DrawMyText: функция не принимает 8 аргументов
Я белый и пушистый но имею когти и зубы
Archido Дата: Вторник, 09 Октября 2012, 18:03 | Сообщение # 16
Сэнсэй
Сейчас нет на сайте
Ну, стоит таки язык подучить, чтобы на таких простых вещах не спотыкаться. Копипастили наверное все в начале своего обучения , но в любом случае нужно пытаться разбираться в этом коде, а не просто делать лишь бы оно "заработало", ибо знаний такое не прибавит (но я думаю, вы это прекрасно понимаете). Неплохо бы взять книжечку и по языку параллельно с Горнаковым, ну и разбираться по ходу дела Добавлено (09.10.2012, 18:03) --------------------------------------------- Чтобы этой ошибки небыло, нужно заменить вот это:
на вот это: Code
VOID DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont, char* StrokaTexta,int x,int y,int x1, int y1,D3DCOLOR MyColor);
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinard Дата: Вторник, 09 Октября 2012, 18:05 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
язык то я подучу вместе с лабами,а ошибку то как исправить ?
Я белый и пушистый но имею когти и зубы
Archido Дата: Вторник, 09 Октября 2012, 18:09 | Сообщение # 18
Сэнсэй
Сейчас нет на сайте
В предыдущем посте ответ
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinard Дата: Среда, 10 Октября 2012, 12:18 | Сообщение # 19
постоянный участник
Сейчас нет на сайте
спасибо,не заметил просто,действительно за лето подзабыл,но ничего мне ещё лаб 12 написать надо,так что вспомню ))Добавлено (10.10.2012, 01:06) ---------------------------------------------
Quote
В первую очередь нужно вынести бОльшую часть кода из заголовочника (.h) в .cpp, в .h файле оставить только объявления ф-ций, глобальные переменные, классы (описание вершин, например), все остальное писать в .cpp.
можеш пожалуйста показать как поумнее будет это сделать,желательно в образе заготовки движкаДобавлено (10.10.2012, 12:18) --------------------------------------------- я хочу понять архитектуру движка,и начать его строить
Я белый и пушистый но имею когти и зубы
Archido Дата: Среда, 10 Октября 2012, 13:41 | Сообщение # 20
Сэнсэй
Сейчас нет на сайте
Quote (redinard )
я хочу понять архитектуру движка,и начать его строить
Чтобы понять архитектуру движков и как они устроены, нужно для начала с одним из них поработать - тогда отпадет очень много вопросов и сие не будет похоже на "делаю то - незнаю что". Чтобы начать "строить" - нужно знать язык на очень уверенном уровне, иначе это будет кривая поделка, большая половина которой представляет собой копипаст кода из различных мест. Могу порекомендовать следующее: попробовать взять несложный 2D движок и наваять на нем небольшую игрушку, параллельно с разработкой игрушки неплохо бы взять в руки Страуструпа и повышать свой уровень владения языком, тут же применяя изученное на практике (при разработке игры). Как итог - узнаешь что вообще из себя представляет движок, как с ним осуществляется работа, ну и язык подтянешь. Дальше можно усиленно DX9 изучать (а не просто копипастить), а после уже и до своего двигла недалеко. Программированию никто ни в каком институте не научит - только самостоятельно, иначе будет очень грустно.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 10 Октября 2012, 13:44