Необходима помощь в освоении азов создания игр
redinard Дата: Четверг, 29 Марта 2012, 22:57 | Сообщение # 81
постоянный участник
Сейчас нет на сайте
народ,вот такой вопрос,у меня есть прога:
#include <windows.h>//заголовочный файл windows #include "d3d9.h"//заголовочный файл DirectX #pragma comment (lib, "d3d9.lib")//вызов библиотеки //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WNDCLASSEX wcex; //моздаём класс HWND hwnd; //создаём дискриптор окна MSG msg; //идентификатор сообщения LPDIRECT3D9 pDirect3D = NULL; //главный обект Direct3D.это указатель на главный интерфейс IDirect3D9 для таботы с графикой. LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; //устройство LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL;//буфер вершин struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z, rhw;//координаты вершины DWORD color; //цвет вершыны }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)//формат содержания вершин HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HRESULT IntialDirect3D(HWND hwnd);//инециалезация Direct3D void RenderingDirect3D();//обявление рендера void DeleteDirect3D();//обявление функции освобождения ресурсов HRESULT InitialBufferVershin(); // Главная функция int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { wcex.cbSize = sizeof(WNDCLASSEX); // Размер всей структуры wcex.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;//Задание стиля окна wcex.lpfnWndProc = WndProc; //Наша функция обработки событий wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance;//Экземпляр приложения wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);//цвет фона wcex.lpszMenuName = NULL; //имя меню wcex.lpszClassName = L"WINDOWSCLASS"; //Имя класса окна wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));// Иконка в заголовке окна if (!RegisterClassEx(&wcex)) return (0); if (!(hwnd = CreateWindow( L"windowsclass", //Имя класса окна L"ДиректХ", // Заголовок окна WS_OVERLAPPEDWINDOW|WS_VISIBLE, //Стиль окна 100, 100, // Координаты левого верхнего угла 600, // Ширина окна 600, // Высота окна NULL, // Дескриптор родительского окна NULL, // Дескриптор меню hInstance, // Экземпляр NULL))) // Дополнительные параметры return (0); if (SUCCEEDED (IntialDirect3D(hwnd))) { if (SUCCEEDED (InitialBufferVershin() )) { ShowWindow (hwnd, SW_SHOWDEFAULT); UpdateWindow (hwnd); ZeroMemory (&msg, sizeof(msg)); while(msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else RenderingDirect3D();//рендер } } } return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)//здесь происходит обработка сообщений { switch (msg) { case WM_DESTROY: { DeleteDirect3D(); PostQuitMessage(0); return (0); } } return DefWindowProc(hwnd, msg, wparam, lparam); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // ИНИЦИАЛИЗАЦИЯ Direct3D // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT IntialDirect3D(HWND hwnd) { if(NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))//создаётся основной указатель на интерфейс IDirect3D9 return E_FAIL; D3DDISPLAYMODE Display;//структура для соответствия текущих установок дисплея if(FAILED(pDirect3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))//получаем текущий формат дисплея return E_FAIL; D3DPRESENT_PARAMETERS Direct3DParametr;//обект параметров представления Direct3DParametr ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));//очищает создаваемую структуру от мусора Direct3DParametr.Windowed = TRUE;//видеорежим используемый нашим приложением Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;//параметр опредиления размеров буфера Direct3DParametr.BackBufferFormat = D3DFMT_UNKNOWN;//формат поверхности заднего буфера if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; return S_OK; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void RenderingDirect3D() { if (pDirect3DDevice == NULL) //проверяем ошибки return; pDirect3DDevice -> Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0), 1.0f, 0); pDirect3DDevice -> BeginScene();//начало сцены //здесь происходит отрисовка сцены pDirect3DDevice -> SetStreamSource(0,pBufferVershin, 0, sizeof(CUSTOMVERTEX)); pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice -> DrawPrimitive (D3DPT_TRIANGLELIST, 0, 1); pDirect3DDevice -> EndScene(); pDirect3DDevice -> Present(NULL, NULL, NULL, NULL); } void DeleteDirect3D()//функция освобождает захваченные ресурсы { if (pBufferVershin != NULL) pBufferVershin -> Release(); if (pDirect3DDevice != NULL) pDirect3DDevice -> Release(); if (pDirect3D != NULL) pDirect3D -> Release(); } HRESULT InitialBufferVershin() { CUSTOMVERTEX Vershin[] = { {300.0f, 300.0f, 0.5f, 1.0f, 0x00000fff,}, {150.0f, 300.0f, 0.5f, 1.0f, 0x00000fff,}, {150.0f, 150.0f, 0.5f, 1.0f, 0x00000fff,}, //x y z цвет }; if (FAILED (pDirect3DDevice -> CreateVertexBuffer( 3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBufferVershin, NULL))) return E_FAIL; void* pBV; if (FAILED(pBufferVershin -> Lock(0, sizeof(Vershin),(void**)&pBV,0))) return E_FAIL; memcpy(pBV, Vershin, sizeof(Vershin));//копирование pBufferVershin -> Unlock();//разблокирование return S_OK; }
как мне её разбить чтобы часть кода отвечающая непосредственно за инициализацию была в этом же файле,а рендер в отдельном файле ?
Я белый и пушистый но имею когти и зубы
zodiak Дата: Пятница, 30 Марта 2012, 10:41 | Сообщение # 82
постоянный участник
Сейчас нет на сайте
Кидаешь функцию рендеринга в отдельные cpp и h файлы. А чтоб не заморачиваться с глобальными переменными делаешь их аргументами функции. Типа так: Code
void RenderingDirect3D(LPDIRECT3DDEVICE9 pDirect3DDevice, LPDIRECT3DVERTEXBUFFER9 pBufferVershin)
зыЖ Горнаков и его BufferVershin рулят)
Точка зору окремо взятого індивіда завжди суб'єктивна! Взломщик Battle City.Net
redinard Дата: Пятница, 30 Марта 2012, 15:57 | Сообщение # 83
постоянный участник
Сейчас нет на сайте
можешь пожалуйста показать на примере рабочего кода,принцып разбиения я знаю,но реализовать мне так и не удалось
Я белый и пушистый но имею когти и зубы
DonKorleone Дата: Пятница, 30 Марта 2012, 16:42 | Сообщение # 84
частый гость
Сейчас нет на сайте
Code
#pragma comment(lib, "d3d9.lib") #include <windows.h> #include "d3d9.h" //*********************************************************** //объявление главного объекта LPDIRECT3D9 g_pD3D = NULL; //объявление девайса LPDIRECT3DDEVICE9 pDevice; //объявление вертекс буффера LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; struct CUSTOMVERTEX { float X, Y, Z, rhw; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE) //*********************************************************** //ф-ция инициализации DirectX9 HRESULT InitD3D(HWND hwnd) { if(NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION))) return E_FAIL; D3DDISPLAYMODE Disp; if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Disp))) return E_FAIL; //параметры показа D3DPRESENT_PARAMETERS d3dpp; ZeroMemory(&d3dpp, sizeof(d3dpp)); d3dpp.Windowed = true; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = Disp.Format; //создание девайса if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDevice))) return E_FAIL; return S_OK; } void RenderD3D() { pDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); pDevice->BeginScene(); //Binding with data stream pDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX)); //Установка формата вершин pDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); pDevice->EndScene(); pDevice->Present(NULL, NULL, NULL, NULL); //показать все } HRESULT InitVertBuff() { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { {300.0f, 300.0f, 0.5f, 1.0f, 0x66FFFF}, //A {150.0f, 300.0f, 0.5f, 1.0f, 0x0033FF}, //B {150.0f, 150.0f, 0.5f, 1.0f, 0xFF3300}, //C //X Y Z {150.0f, 150.0f, 0.5f, 1.0f, 0xFF3300}, //C {300.0f, 150.0f, 0.5f, 1.0f, 0x009933}, //D {300.0f, 300.0f, 0.5f, 1.0f, 0x66FFFF}, //A }; // | - кол-во вершин прямо пропорционально числу перед sizeof if(FAILED(pDevice->CreateVertexBuffer(6*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 FreeD3D() { if(pVertBuff != NULL) pVertBuff->Release(); if(pDevice != NULL) pDevice->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)); }
Code
#include "stdafx.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //создание класса окна WNDCLASSEX wc; //Главный обработчик событий 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(BLACK_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = L"TEST_WIN32"; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Регистрация созданного класса RegisterClassEx(&wc); HWND hwnd; //handle окна //Создание окна 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 (int)(msg.wParam); }
Как то так...
Сообщение отредактировал DonKorleone - Пятница, 30 Марта 2012, 16:56
redinard Дата: Среда, 04 Апреля 2012, 23:18 | Сообщение # 85
постоянный участник
Сейчас нет на сайте
Огромное спасибо, но мог бы кто нибудь помочь сделать код примерно так : основную часть программы оставить в одном файле
#include <windows.h>//заголовочный файл windows #include "d3d9.h"//заголовочный файл DirectX #pragma comment (lib, "d3d9.lib")//вызов библиотеки //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// WNDCLASSEX wcex; //моздаём класс HWND hwnd; //создаём дискриптор окна MSG msg; //идентификатор сообщения LPDIRECT3D9 pDirect3D = NULL; //главный обект Direct3D.это указатель на главный интерфейс IDirect3D9 для таботы с графикой. LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; //устройство LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL;//буфер вершин struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z, rhw;//координаты вершины DWORD color; //цвет вершыны }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)//формат содержания вершин HINSTANCE hInst; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); HRESULT IntialDirect3D(HWND hwnd);//инециалезация Direct3D void RenderingDirect3D();//обявление рендера void DeleteDirect3D();//обявление функции освобождения ресурсов HRESULT InitialBufferVershin(); // Главная функция int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// { wcex.cbSize = sizeof(WNDCLASSEX); // Размер всей структуры wcex.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;//Задание стиля окна wcex.lpfnWndProc = WndProc; //Наша функция обработки событий wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance;//Экземпляр приложения wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);//цвет фона wcex.lpszMenuName = NULL; //имя меню wcex.lpszClassName = L"WINDOWSCLASS"; //Имя класса окна wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));// Иконка в заголовке окна if (!RegisterClassEx(&wcex)) return (0); if (!(hwnd = CreateWindow( L"windowsclass", //Имя класса окна L"ДиректХ", // Заголовок окна WS_OVERLAPPEDWINDOW|WS_VISIBLE, //Стиль окна 100, 100, // Координаты левого верхнего угла 600, // Ширина окна 600, // Высота окна NULL, // Дескриптор родительского окна NULL, // Дескриптор меню hInstance, // Экземпляр NULL))) // Дополнительные параметры return (0); if (SUCCEEDED (IntialDirect3D(hwnd))) { if (SUCCEEDED (InitialBufferVershin() )) { ShowWindow (hwnd, SW_SHOWDEFAULT); UpdateWindow (hwnd); ZeroMemory (&msg, sizeof(msg)); while(msg.message != WM_QUIT) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } else RenderingDirect3D();//рендер } } } return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)//здесь происходит обработка сообщений { switch (msg) { case WM_DESTROY: { DeleteDirect3D(); PostQuitMessage(0); return (0); } } return DefWindowProc(hwnd, msg, wparam, lparam); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // ИНИЦИАЛИЗАЦИЯ Direct3D // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT IntialDirect3D(HWND hwnd) { if(NULL == (pDirect3D = Direct3DCreate9(D3D_SDK_VERSION)))//создаётся основной указатель на интерфейс IDirect3D9 return E_FAIL; D3DDISPLAYMODE Display;//структура для соответствия текущих установок дисплея if(FAILED(pDirect3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &Display)))//получаем текущий формат дисплея return E_FAIL; D3DPRESENT_PARAMETERS Direct3DParametr;//обект параметров представления Direct3DParametr ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));//очищает создаваемую структуру от мусора Direct3DParametr.Windowed = TRUE;//видеорежим используемый нашим приложением Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;//параметр опредиления размеров буфера Direct3DParametr.BackBufferFormat = D3DFMT_UNKNOWN;//формат поверхности заднего буфера if (FAILED(pDirect3D -> CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; return S_OK; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
а рендер запилить в другой файл
void RenderingDirect3D() { if (pDirect3DDevice == NULL) //проверяем ошибки return; pDirect3DDevice -> Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,255,0), 1.0f, 0); pDirect3DDevice -> BeginScene();//начало сцены //здесь происходит отрисовка сцены pDirect3DDevice -> SetStreamSource(0,pBufferVershin, 0, sizeof(CUSTOMVERTEX)); pDirect3DDevice -> SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice -> DrawPrimitive (D3DPT_TRIANGLELIST, 0, 1); pDirect3DDevice -> EndScene(); pDirect3DDevice -> Present(NULL, NULL, NULL, NULL); } void DeleteDirect3D()//функция освобождает захваченные ресурсы { if (pBufferVershin != NULL) pBufferVershin -> Release(); if (pDirect3DDevice != NULL) pDirect3DDevice -> Release(); if (pDirect3D != NULL) pDirect3D -> Release(); } HRESULT InitialBufferVershin() { CUSTOMVERTEX Vershin[] = { {300.0f, 300.0f, 0.5f, 1.0f, 0x00000fff,}, {150.0f, 300.0f, 0.5f, 1.0f, 0x00000fff,}, {150.0f, 150.0f, 0.5f, 1.0f, 0x00000fff,}, //x y z цвет }; if (FAILED (pDirect3DDevice -> CreateVertexBuffer( 3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &pBufferVershin, NULL))) return E_FAIL; void* pBV; if (FAILED(pBufferVershin -> Lock(0, sizeof(Vershin),(void**)&pBV,0))) return E_FAIL; memcpy(pBV, Vershin, sizeof(Vershin));//копирование pBufferVershin -> Unlock();//разблокирование return S_OK; }
я понимаю что мне это уже показали,но хотелось бы чтобы код был примерно в таком оформлении (мне так легче его воспринимать)Добавлено (01.04.2012, 23:09) --------------------------------------------- извиняюсь,просмотрел бегло программу,пересмотрел её ещё раз оказывается всё так как надо и предельно понятно )
Добавлено (04.04.2012, 23:18) --------------------------------------------- народ подскажите в чём ошибка ?
//render.h #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; //объявление вертекс буффера struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z, rhw;//координаты вершины DWORD color; //цвет вершыны }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|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; //формат поверхности заднего буфера //создание девайса if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; pDirect3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE); pDirect3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE); return S_OK; } /////////////////////////////////////////////////////////////////////////////////////////////////// void RenderD3D() { if(pDirect3DDevice==NULL) return; pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0); pDirect3DDevice->BeginScene(); //начало сцены //здесь происходит отрисовка сцены pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX)); //Установка формата вершин pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); pDirect3DDevice->EndScene(); //конец сцены pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitVertBuff() { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { {1.0f, -1.0f, 0.0f, 0x00000fff}, //A {-1.0f, -1.0f, 0.0f, 0xff000ff}, //B {-1.0f, 1.0f, 0.0f, 0x00000ff}, //C //X Y Z {-1.0f, 1.0f, 0.0f, 0x00000fff}, //C {1.0f, 1.0f, 0.0f, 0xff000fff}, //D {1.0f, -1.0f, 0.0f, 0x00000fff}, //A }; // | - кол-во вершин прямо пропорционально числу перед sizeof if(FAILED(pDirect3DDevice->CreateVertexBuffer( 6*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; D3DXMATRIX MatrixView; D3DXMATRIX MatrixProjection; UINT Time = timeGetTime()% 5000; FLOAT Angle = Time*(2.0*D3DX_PI)/5000.0f; D3DXMatrixRotationY(&MatrixWorld,Angle); pDirect3DDevice->SetTransform(D3DTS_WORLD,&MatrixWorld); D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.f), &D3DXVECTOR3(0.0f,0.0f,0.0f), &D3DXVECTOR3(0.0f,0.0f,0.0f)); D3DXMatrixPerspectiveFovLH(&MatrixProjection, D3DX_PI/4,1.0f,1.0f,100.0f); pDirect3DDevice->SetTransform(D3DTS_PROJECTION,&MatrixProjection); }
#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); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////
Я белый и пушистый но имею когти и зубы
Zweifx Дата: Среда, 04 Апреля 2012, 23:42 | Сообщение # 86
был не раз
Сейчас нет на сайте
redinard , Похоже библиотека winmm отсутствует, добавь ее.
Если никто не знает, это то же самое, как если бы этого не было вовсе.
redinard Дата: Четверг, 05 Апреля 2012, 00:02 | Сообщение # 87
постоянный участник
Сейчас нет на сайте
да спасибо я это уже сам понялДобавлено (05.04.2012, 00:02) --------------------------------------------- вот только для меня остаётся загадкой то что вместо вращающегося синего квадрата у меня чёрный экран
Я белый и пушистый но имею когти и зубы
Zweifx Дата: Четверг, 05 Апреля 2012, 00:15 | Сообщение # 88
был не раз
Сейчас нет на сайте
redinard , Ты не перевел формат вершин из D3DFVF_XYZRHW в D3DFVF_XYZ во первых, во вторых ты не применил функцию матриц, в третьих у тебя допущена ошибка в самой функции матрицы( Ты не написал SetTransform( D3DTS_VIEW, &MatrixView ) Установку матрицы вида). В общем я исправил твои ошибки, вот код:
Code
#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; //объявление вертекс буффера VOID Matrix(); struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z; //координаты вершины 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; //формат поверхности заднего буфера //создание девайса if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDirect3DDevice)))//обект интерфейса устройства return E_FAIL; pDirect3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); pDirect3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE); return S_OK; } /////////////////////////////////////////////////////////////////////////////////////////////////// void RenderD3D() { if(pDirect3DDevice==NULL) return; pDirect3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(100,100,100), 1.0f, 0); pDirect3DDevice->BeginScene(); //начало сцены Matrix(); //здесь происходит отрисовка сцены pDirect3DDevice->SetStreamSource(0, pVertBuff, 0, sizeof(CUSTOMVERTEX)); //Установка формата вершин pDirect3DDevice->SetFVF(D3DFVF_CUSTOMVERTEX); pDirect3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); pDirect3DDevice->EndScene(); //конец сцены pDirect3DDevice->Present(NULL, NULL, NULL, NULL); //показать все } /////////////////////////////////////////////////////////////////////////////////////////////////////////////// HRESULT InitVertBuff() { //проектируем вертексный буфер CUSTOMVERTEX Vertex[] = { {1.0f, -1.0f, 0.0f, 0x00000ff}, //A {-1.0f, -1.0f, 0.0f, 0xff000ff}, //B {-1.0f, 1.0f, 0.0f, 0x00000ff}, //C //X Y Z {-1.0f, 1.0f, 0.0f, 0x00000ff}, //C {1.0f, 1.0f, 0.0f, 0xff000ff}, //D {1.0f, -1.0f, 0.0f, 0x00000ff}, //A }; // | - кол-во вершин прямо пропорционально числу перед sizeof if(FAILED(pDirect3DDevice->CreateVertexBuffer(6*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; D3DXMATRIX MatrixView; D3DXMATRIX MatrixProjection; UINT Time = timeGetTime() % 5000; FLOAT Angle = Time*(2.0*D3DX_PI)/5000.0f; D3DXMatrixRotationY(&MatrixWorld, Angle); pDirect3DDevice->SetTransform(D3DTS_WORLD, &MatrixWorld); D3DXMatrixLookAtLH(&MatrixView,&D3DXVECTOR3(0.0f,0.0f,-8.0f), &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); }
Code
#include "render.h" LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)//здесь происходит обработка сообщений { switch (msg) { case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wparam, lparam); } 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 = "TEST_WIN32"; //Имя класса окна wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Регистрация созданного класса RegisterClassEx(&wc); // Иконка в заголовке окна ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Создание окна if(!(hwnd = CreateWindowEx(NULL, "TEST_WIN32", "База для 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; } ////////////////////////////////////////////////////////////////////////////////////////////////////////////
Если никто не знает, это то же самое, как если бы этого не было вовсе.
redinard Дата: Четверг, 05 Апреля 2012, 00:47 | Сообщение # 89
постоянный участник
Сейчас нет на сайте
огромное спасибо
Я белый и пушистый но имею когти и зубы
Тритон Дата: Понедельник, 16 Апреля 2012, 08:22 | Сообщение # 90
постоянный участник
Сейчас нет на сайте
Quote (LQarum )
*(GameBoard+h*HEIGHT+w)=X;
Перепутаны размеры: если без умножения у тебя w. то имеешь номер ряда в w и номер ряда в h, то есть размер ряда - диапазон по w. то есть WIDTH.
Не всё так плохо, как оно есть на самом деле.