помощь в разработке движка
redinard Дата: Понедельник, 15 Октября 2012, 22:55 | Сообщение # 21
постоянный участник
Сейчас нет на сайте
Я понял,можеш тогда хотябы преобразовать и выложить здесь мой код как ты посоветовал Quote
В первую очередь нужно вынести бОльшую часть кода из заголовочника (.h) в .cpp, в .h файле оставить только объявления ф-ций, глобальные переменные, классы (описание вершин, например), все остальное писать в .cpp
буду очень благодаренДобавлено (10.10.2012, 20:18) --------------------------------------------- возникла ещё проблемма,код компилится, но не работает
#include "Global_Includes.h" //----------------------------------------------------------------------------------- // Глобальные переменные //----------------------------------------------------------------------------------- LPDIRECT3D9 g_pD3D = NULL; // Главный Direct3D обьект LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; // Устройство LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; // Буфер вершин LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер LPDIRECT3DVERTEXBUFFER9 pVertBuff = NULL; LPDIRECT3DTEXTURE9 pTextura001 = NULL; // Текстyра LPD3DXFONT pFont = NULL; // Шрифт Diect3D RECT Rec; // Прямоугольник HFONT hFont; // Шрифт void DrawMyText(LPDIRECT3DDEVICE9 pDirect3DDevice,HFONT hFont, char* StrokaTexta,int x,int y,int x1, int y1,D3DCOLOR MyColor); void LightMaterial(); void Matrix(); struct CUSTOMVERTEX//структура определяющая формат вершин { float x, y, z;//координаты вершины float nx,ny,nz; //нормали float tu,tv; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)//формат содержания вершин /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // ИНИЦИАЛИЗАЦИЯ 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->SetTexture( 0,pTextura001); //вывод объекта pDirect3DDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); pDirect3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE); pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,36,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[] = { // x y z nx ny nz tu tv { 1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 1.0f, 1.0f,}, //А { 1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 1.0f,}, //В { -1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,}, //С { -1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 1.0f, 0.0f,}, //D { -1.0f,-1.0f,-1.0f,-1.0f, 0.0f, 0.0f, 1.0f, 1.0f,}, //A2 { -1.0f, 1.0f,-1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 1.0f,}, //B2 { -1.0f, 1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,}, //C2 { -1.0f,-1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f,}, //D2 { -1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,}, //A3 { -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,}, //B3 { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,}, //C3 { 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,}, //D3 { 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,}, //A4 { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,}, //B4 { 1.0f, 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,}, //C4 { 1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,}, //D4 { 1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, 1.0f, 1.0f,}, //A5 { -1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f,}, //B5 { -1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,}, //C5 { 1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 1.0f, 0.0f,}, //D5 { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,}, //A6 { -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,}, //B6 { -1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,}, //C6 { 1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,}, //D6 // x y z nx ny nz tu tv }; 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, }; //загружаем текстуру if(FAILED(D3DXCreateTextureFromFile(pDirect3DDevice, L"Directx.jpg",&pTextura001))) return E_FAIL; // | - кол-во вершин прямо пропорционально числу перед 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) { MyColor = D3DCOLOR_ARGB(250,250,250,50); // Создаем шрифт D3DXCreateFont(pDirect3DDevice,30,10,FW_NORMAL,0,FALSE,1,0,0,DEFAULT_PITCH|FF_MODERN,L"Arial",&pFont); // Координаты прямоугольника Rec.left = x; Rec.top = y; Rec.right = x1; Rec.bottom = y1; // Вывод текста pFont->DrawText(NULL,L"Нерода Н.Н.", -1, &Rec, DT_WORDBREAK, MyColor); // удаляем pFont->Release(); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // 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( pTextura001 != NULL ) pTextura001->Release(); if( pBufferIndex != NULL) pBufferIndex->Release(); if( pBufferVershin != NULL) pBufferVershin->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)); }
Добавлено (15.10.2012, 22:55) --------------------------------------------- народ,подскажите в чём проблемма
Я белый и пушистый но имею когти и зубы
Сообщение отредактировал redinard - Среда, 10 Октября 2012, 14:15
Нохчи Дата: Вторник, 16 Октября 2012, 01:09 | Сообщение # 22
заслуженный участник
Сейчас нет на сайте
redinard , никто не станет читать, и тем более разбирать такую простыню.
Многие вопросы по Windows отпадут, если посмотреть тут
redinard Дата: Среда, 17 Октября 2012, 12:22 | Сообщение # 23
постоянный участник
Сейчас нет на сайте
надеюсь всё же кто-нибудь прочитает вот кстати оригенал кода
//----------------------------------------------------------------------------------- // MultiTextura.CPP // Используем текстурy //----------------------------------------------------------------------------------- #pragma comment(lib, "winmm.lib") #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include <windows.h> // Подключаем заголовочный файл Windows #include <d3d9.h> // Подключаем заголовочный файл DirectX 9 SDK #include <d3dx9.h> // Подключаем из D3DX утилит для работы с матрицами #include <mmsystem.h> // Подключаем системную библеотеку #include <d3dx9core.h> // Подключаем системный заголовочный файл //----------------------------------------------------------------------------------- // Глобальные переменные //----------------------------------------------------------------------------------- LPDIRECT3D9 pDirect3D = NULL; // Главный Direct3D обьект LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; // Устройство LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; // Буфер вершин LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер LPDIRECT3DTEXTURE9 pTextura001 = NULL; // Текстyра 1 LPDIRECT3DTEXTURE9 pTextura002 = NULL; // Текстyра 2 LPD3DXFONT pFont = NULL; // Шрифт Diect3D RECT Rec; // Прямоугольник HFONT hFont; // Шрифт struct CUSTOMVERTEX { FLOAT x, y, z; //кординаты FLOAT nx, ny, nz; //нормали FLOAT tu, tv; //техтура }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) // Формат вершин //----------------------------------------------------------------------------------- // Функция // InitialDirect3D() // Инициализация Direct3D //----------------------------------------------------------------------------------- HRESULT InitialDirect3D( HWND hwnd ) { if( NULL == ( pDirect3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL; D3DDISPLAYMODE Display; if( FAILED( pDirect3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &Display ) ) ) return E_FAIL; D3DPRESENT_PARAMETERS Direct3DParametr; ZeroMemory( &Direct3DParametr, sizeof(Direct3DParametr) ); Direct3DParametr.Windowed = FALSE; Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD; Direct3DParametr.BackBufferFormat = Display.Format; Direct3DParametr.EnableAutoDepthStencil = TRUE; Direct3DParametr.AutoDepthStencilFormat = D3DFMT_D16; Direct3DParametr.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);; Direct3DParametr.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN); Direct3DParametr.BackBufferCount = 3; Direct3DParametr.FullScreen_RefreshRateInHz = Display.RefreshRate; if( FAILED( pDirect3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice ) ) ) return E_FAIL; // Включаем отсеченние Direct3D pDirect3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ); // Подключаем Z буфер pDirect3DDevice->SetRenderState (D3DRS_ZENABLE, D3DZB_TRUE); return S_OK; } //--------------------------------------------------------------------------------------- // Функция // InitialObject() // Иннициализирует вершины //--------------------------------------------------------------------------------------- HRESULT InitialObject() { CUSTOMVERTEX Vershin[] = { // x y z nx ny nz tu tv { 1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 1.0f, 1.0f,}, //А { 1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 1.0f,}, //В { -1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,}, //С { -1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 1.0f, 0.0f,}, //D { -1.0f,-1.0f,-1.0f,-1.0f, 0.0f, 0.0f, 1.0f, 1.0f,}, //A2 { -1.0f, 1.0f,-1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 1.0f,}, //B2 { -1.0f, 1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,}, //C2 { -1.0f,-1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f,}, //D2 { -1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,}, //A3 { -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,}, //B3 { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,}, //C3 { 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,}, //D3 { 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,}, //A4 { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,}, //B4 { 1.0f, 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,}, //C4 { 1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,}, //D4 { 1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, 1.0f, 1.0f,}, //A5 { -1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f,}, //B5 { -1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,}, //C5 { 1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 1.0f, 0.0f,}, //D5 { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,}, //A6 { -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,}, //B6 { -1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,}, //C6 { 1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,}, //D6 // x y z nx ny nz tu tv }; 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, }; // Загружаем текстру if( FAILED( D3DXCreateTextureFromFile( pDirect3DDevice, L"Directx.jpg", &pTextura001 ) ) ) return E_FAIL; // Загружаем вторую текстру if( FAILED( D3DXCreateTextureFromFile( pDirect3DDevice, L"Reshetka.bmp", &pTextura002 ) ) ) return E_FAIL; // Создаем буфер вершин if( FAILED( pDirect3DDevice->CreateVertexBuffer( 36 * 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(); // Создаем индексный буфер pDirect3DDevice->CreateIndexBuffer( 36 * sizeof(Index), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&pBufferIndex, NULL); //Блокируем VOID* pBI; pBufferIndex->Lock( 0, sizeof(Index) , (void**)&pBI, 0 ); //Копируем memcpy( pBI, Index, sizeof(Index) ); // Разблокируем pBufferIndex->Unlock(); return S_OK; } //----------------------------------------------------------------------------- // Функция // Matrix() // Мировая матрица, матрица вида, матрица проекции //----------------------------------------------------------------------------- VOID Matrix() { D3DXMATRIX MatrixWorld, MatrixWorldX, MatrixWorldY; // Мировая матрица (MatrixWorld) D3DXMATRIX MatrixView; // Матрица вида (MatrixView) D3DXMATRIX MatrixProjection; // Матрица проекции (MatrixProjection) // MatrixWorld UINT Time = timeGetTime() % 5000; FLOAT Angel = Time * (2.0f * D3DX_PI) / 5000.0f; D3DXMatrixRotationX( &MatrixWorldX, 0 ); D3DXMatrixRotationY( &MatrixWorldY, 0 ); D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY ); pDirect3DDevice->SetTransform( D3DTS_WORLD,&MatrixWorld ); // MatrixView 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 ); // MatrixProjection D3DXMatrixPerspectiveFovLH( &MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); pDirect3DDevice->SetTransform( D3DTS_PROJECTION, &MatrixProjection ); } //---------------------------------------------------------------------------------- // Функция // 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 = 1.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.0f; // Установим нормаль 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 ); } //-------------------------------------------------------------------------------------- // Функция // DrawMyText() // Выводит текст на экран //-------------------------------------------------------------------------------------- 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,L"Arial",&pFont); // Координаты прямоугольника Rec.left = x; Rec.top = y; Rec.right = x1; Rec.bottom = y1; // Вывод текста pFont->DrawText(NULL,L"StrokaTexta", -1, &Rec, DT_WORDBREAK, MyColor); // удаляем pFont->Release(); } //----------------------------------------------------------------------------------- // Функция // RenderingDirect3D() // Рисуем //----------------------------------------------------------------------------------- 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->SetTexture (0, pTextura001); pDirect3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); // Установки для второй текстуры pDirect3DDevice->SetTexture (1, pTextura002); pDirect3DDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 ); pDirect3DDevice->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE); pDirect3DDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE); // Вывод объекта pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12); // Вывод текста DrawMyText(pDirect3DDevice, hFont,"Урок 11\nМультитекстурирование\nДля выхода нажмите клавишу Esc ", 10,10,500,700,D3DCOLOR_ARGB(250,250,250,50)); // Конец сцены pDirect3DDevice->EndScene(); // Выводим на экран pDirect3DDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------------- // Функция // DeleteDirect3D() // Освобождает захваченные ресурсы //----------------------------------------------------------------------------------- VOID DeleteDirect3D() { if( pTextura002 != NULL ) pTextura002->Release(); if( pTextura001 != NULL ) pTextura001->Release(); if( pBufferIndex != NULL) pBufferIndex->Release(); if( pBufferVershin != NULL) pBufferVershin->Release(); if( pDirect3DDevice != NULL) pDirect3DDevice->Release(); if( pDirect3D != NULL) pDirect3D->Release(); } //----------------------------------------------------------------------------------- // Функция // MainWinProc() // Здесь происходит обработка сообщений //----------------------------------------------------------------------------------- LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch(msg) { case WM_DESTROY: { DeleteDirect3D(); PostQuitMessage(0); return(0); } case WM_KEYDOWN: { if(wparam==VK_ESCAPE) PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wparam, lparam); } //----------------------------------------------------------------------------------- // Функция // WinMain // Входная точка приложения //----------------------------------------------------------------------------------- int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX windowsclass; // Создаем класс HWND hwnd; // Создаем дескриптор окна MSG msg; // Идентификатор сообщения // Определим класс окна WNDCLASSEX windowsclass.cbSize = sizeof(WNDCLASSEX); windowsclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; windowsclass.lpfnWndProc = MainWinProc; windowsclass.cbClsExtra = 0; windowsclass.cbWndExtra = 0; windowsclass.hInstance = hinstance; windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW); windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); windowsclass.lpszMenuName = NULL; windowsclass.lpszClassName = L"WINDOWSCLASS"; windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Зарегистрируем класс if (!RegisterClassEx(&windowsclass)) return(0); // Теперь когда класс зарегестрирован можно создать окно if (!(hwnd = CreateWindowEx(NULL, // стиль окна L"WINDOWSCLASS", // класс 0, // название окна WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // левый верхний угол GetSystemMetrics(SM_CXSCREEN),// ширина GetSystemMetrics(SM_CYSCREEN),// высота NULL, // дескриптор родительского окна NULL, // дескриптор меню hinstance, // дескриптор экземпляра приложения NULL))) // указатель на данные окна return 0; if( SUCCEEDED( InitialDirect3D( hwnd ) ) ) { if( SUCCEEDED( InitialObject( ) ) ) { 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; }
Добавлено (16.10.2012, 02:13) --------------------------------------------- все я сам разобрался с кодом ! Добавлено (17.10.2012, 12:22) --------------------------------------------- Народ у меня возникла такая проблемма,я давно взял прилогаемый код к одной книге и откомпилировал его с использованием инклудов и либ-файлов взятых уже не помню с какого сайта и всё замечательно компилировалось,сегодня попытался откомпилить вновь с использованием DXSDK_Aug08 и вот что получилось Quote
1>e:\создание игр\элементы игры\рабочие элементы\d3d_mapviewer\main.cpp(278) : warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> e:\program files\microsoft visual studio 9.0\vc\include\stdio.h(366): см. объявление 'sprintf' 1>e:\создание игр\элементы игры\рабочие элементы\d3d_mapviewer\main.cpp(281) : error C2660: ID3DXFont::DrawTextA: функция не принимает 5 аргументов 1>e:\создание игр\элементы игры\рабочие элементы\d3d_mapviewer\main.cpp(392) : error C2660: D3DXCreateFontA: функция не принимает 3 аргументов 1>Журнал построения был сохранен в "file://e:\создание игр\элементы игры\РАБОЧИЕ ЭЛЕМЕНТЫ\D3D_MapViewer\Debug\BuildLog.htm" 1>D3D_MapViewer - ошибок 2, предупреждений 1 ========== Перестроение всех: успешно: 0, с ошибками: 1, пропущено: 0 ==========
если я подключаю старые инклуды и либы то всё работает нормально,но сейчас я делаю свои проекты на DXSDK_Aug08,и если подключён он и старый DXSDK то код прилогаемый к книге работает,а мой нет,возникает вопрос какой DXSDK будет использовать наиболее рационально ?
Я белый и пушистый но имею когти и зубы
Сообщение отредактировал redinard - Среда, 17 Октября 2012, 12:23
Archido Дата: Среда, 17 Октября 2012, 12:36 | Сообщение # 24
Сэнсэй
Сейчас нет на сайте
Я на прошлой странице писал, что более ли менее современный DX SDK несколько отличается от того, который использовался при написании книги. Но отличается он, в принципе, незначительно - исправить не особо сложно. Если париться лень - то просто используй то, с чем компилится нормально, и нет проблем...
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 17 Октября 2012, 12:36
redinard Дата: Среда, 17 Октября 2012, 13:24 | Сообщение # 25
постоянный участник
Сейчас нет на сайте
впринципе для меня не проблемма переделать код под новый SDK,я просто хотел уточнить в чём суть проблеммыДобавлено (17.10.2012, 13:24) ---------------------------------------------Archido , можеш подсказать как строить тайловые карты на примере моего кода
Я белый и пушистый но имею когти и зубы
Archido Дата: Среда, 17 Октября 2012, 14:06 | Сообщение # 26
Сэнсэй
Сейчас нет на сайте
Quote (redinard )
можеш подсказать как строить тайловые карты на примере моего кода
Что конкретно подразумевается под тайловыми картами? Подсказать то могу, но код писать за тебя я не буду
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
redinard Дата: Среда, 17 Октября 2012, 14:18 | Сообщение # 27
постоянный участник
Сейчас нет на сайте
под тайловыми картами я подрозумеваю карты состоящие из блоков одинакового размера,к примеру мне необходимо создать карту 100х100 состоящую из тайлов 16х16, вопрос состоит в том как это сделать ?Добавлено (17.10.2012, 14:18) --------------------------------------------- у меня есть код с их реализацией,но хочется самому сделать,мне нужна подсказка как это делается
Я белый и пушистый но имею когти и зубы
Archido Дата: Среда, 17 Октября 2012, 14:37 | Сообщение # 28
Сэнсэй
Сейчас нет на сайте
Quote (redinard )
у меня есть код с их реализацией,но хочется самому сделать,мне нужна подсказка как это делается
Так поразбирал бы код и возможно разобрался бы Про "тайловые карты" как-то смутно описано и не ясно как из 16х16 можно сделать 100х100 Делается вертексный буфер, в него складываются эти самые 16х16 тайлов - получаеттся сетка 16х16 квадратов, потом можно рисовать этот блок нужное кол-во раз, меняя только матрицу трансформаций, чтобы рисовать сие в необходимом тебе месте.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
Сообщение отредактировал Archido - Среда, 17 Октября 2012, 14:37
redinard Дата: Вторник, 30 Октября 2012, 22:30 | Сообщение # 29
постоянный участник
Сейчас нет на сайте
изменил код,откомпилировал,работает,но не выдаёт желаемого резкльтата,возникает вопрос почему ? код Dezmond_Graphic.h
#include "Global_Includes.h" //----------------------------------------------------------------------------------- // Глобальные переменные //----------------------------------------------------------------------------------- LPDIRECT3D9 pDirect3D = NULL; // Главный Direct3D обьект LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; // Устройство LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; // Буфер вершин LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер LPDIRECT3DTEXTURE9 pTextura001 = NULL; // Текстyра 1 LPDIRECT3DTEXTURE9 pTextura002 = NULL; // Текстyра 2 LPD3DXFONT pFont = NULL; // Шрифт Diect3D RECT Rec; // Прямоугольник HFONT hFont; // Шрифт struct CUSTOMVERTEX { FLOAT x, y, z; //кординаты FLOAT nx, ny, nz; //нормали FLOAT tu, tv; //техтура }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1) // Формат вершин //----------------------------------------------------------------------------------- // Функция // InitialDirect3D() // Инициализация Direct3D //----------------------------------------------------------------------------------- HRESULT InitialDirect3D( HWND hwnd ) { if( NULL == ( pDirect3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) 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 = FALSE;//видеорежим используемый нашим приложением Direct3DParametr.SwapEffect = D3DSWAPEFFECT_DISCARD;//параметр опредиления размеров буфера Direct3DParametr.BackBufferFormat = Display.Format;//формат поверхности заднего буфера Direct3DParametr.EnableAutoDepthStencil = TRUE;//значение показывающее возможность создания Z буфера Direct3DParametr.AutoDepthStencilFormat = D3DFMT_D16;//формат поверхности Z буфера Direct3DParametr.BackBufferWidth = GetSystemMetrics(SM_CXSCREEN);; Direct3DParametr.BackBufferHeight = GetSystemMetrics(SM_CYSCREEN); Direct3DParametr.BackBufferCount = 3; Direct3DParametr.FullScreen_RefreshRateInHz = Display.RefreshRate; if( FAILED( pDirect3D -> CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirect3DDevice ) ) ) return E_FAIL; // Включаем отсеченние Direct3D pDirect3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ); // Подключаем Z буфер pDirect3DDevice->SetRenderState (D3DRS_ZENABLE, D3DZB_TRUE); return S_OK; } //--------------------------------------------------------------------------------------- // Функция // InitialObject() // Иннициализирует вершины //--------------------------------------------------------------------------------------- HRESULT InitialObject() { CUSTOMVERTEX Vershin[] = { // x y z nx ny nz tu tv { 1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 1.0f, 1.0f,}, //А { 1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 1.0f,}, //В { -1.0f, 1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 0.0f, 0.0f,}, //С { -1.0f,-1.0f,-1.0f, 0.0f, 0.0f,-1.0f, 1.0f, 0.0f,}, //D { -1.0f,-1.0f,-1.0f,-1.0f, 0.0f, 0.0f, 1.0f, 1.0f,}, //A2 { -1.0f, 1.0f,-1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 1.0f,}, //B2 { -1.0f, 1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,}, //C2 { -1.0f,-1.0f, 1.0f,-1.0f, 0.0f, 0.0f, 1.0f, 0.0f,}, //D2 { -1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f,}, //A3 { -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f,}, //B3 { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f,}, //C3 { 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f,}, //D3 { 1.0f,-1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f,}, //A4 { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,}, //B4 { 1.0f, 1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,}, //C4 { 1.0f,-1.0f,-1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f,}, //D4 { 1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, 1.0f, 1.0f,}, //A5 { -1.0f,-1.0f,-1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 1.0f,}, //B5 { -1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,}, //C5 { 1.0f,-1.0f, 1.0f, 0.0f,-1.0f, 0.0f, 1.0f, 0.0f,}, //D5 { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f,}, //A6 { -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f,}, //B6 { -1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,}, //C6 { 1.0f, 1.0f,-1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f,}, //D6 // x y z nx ny nz tu tv }; 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, }; // Загружаем текстру if( FAILED( D3DXCreateTextureFromFile( pDirect3DDevice, L"Directx.jpg", &pTextura001 ) ) ) return E_FAIL; // Создаем буфер вершин if( FAILED( pDirect3DDevice->CreateVertexBuffer( 36 * 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(); // Создаем индексный буфер pDirect3DDevice->CreateIndexBuffer( 36 * sizeof(Index), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&pBufferIndex, NULL); //Блокируем VOID* pBI; pBufferIndex->Lock( 0, sizeof(Index) , (void**)&pBI, 0 ); //Копируем memcpy( pBI, Index, sizeof(Index) ); // Разблокируем pBufferIndex->Unlock(); return S_OK; } //----------------------------------------------------------------------------- // Функция // Matrix() // Мировая матрица, матрица вида, матрица проекции //----------------------------------------------------------------------------- VOID Matrix() { D3DXMATRIX MatrixWorld, MatrixWorldX, MatrixWorldY; // Мировая матрица (MatrixWorld) D3DXMATRIX MatrixView; // Матрица вида (MatrixView) D3DXMATRIX MatrixProjection; // Матрица проекции (MatrixProjection) // MatrixWorld UINT Time = timeGetTime() % 5000; FLOAT Angel = Time * (2.0f * D3DX_PI) / 5000.0f; D3DXMatrixRotationX( &MatrixWorldX, 0 ); D3DXMatrixRotationY( &MatrixWorldY, 0 ); D3DXMatrixMultiply(&MatrixWorld,&MatrixWorldX,&MatrixWorldY ); pDirect3DDevice->SetTransform( D3DTS_WORLD,&MatrixWorld ); // MatrixView 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 ); // MatrixProjection D3DXMatrixPerspectiveFovLH( &MatrixProjection, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); pDirect3DDevice->SetTransform( D3DTS_PROJECTION, &MatrixProjection ); } //---------------------------------------------------------------------------------- // Функция // 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 = 1.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.0f; // Установим нормаль 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 ); } //-------------------------------------------------------------------------------------- // Функция // DrawMyText() // Выводит текст на экран //-------------------------------------------------------------------------------------- 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,L"Arial",&pFont); // Координаты прямоугольника Rec.left = x; Rec.top = y; Rec.right = x1; Rec.bottom = y1; // Вывод текста pFont->DrawText(NULL,L"Нерода Н.Н.", -1, &Rec, DT_WORDBREAK, MyColor); // удаляем pFont->Release(); } //----------------------------------------------------------------------------------- // Функция // RenderingDirect3D() // Рисуем //----------------------------------------------------------------------------------- VOID RenderingDirect3D( int iXPos, int iYPos, float fXSize, float fYSize, int iTexture) { D3DXMATRIX matWorld, matRotation, matTranslation, matScale; float fXPos, fYPos; // Set default position,scale,rotation D3DXMatrixIdentity( &matTranslation ); // Scale the sprite D3DXMatrixScaling( &matScale, fXSize, fYSize, 1.0f ); D3DXMatrixMultiply( &matTranslation, &matTranslation, &matScale ); // Rotate the sprite D3DXMatrixRotationZ( &matRotation, 0.0f ); D3DXMatrixMultiply( &matWorld, &matTranslation, &matRotation ); // Calculate the position in screen-space fXPos = (float)(-(GetSystemMetrics(SM_CXSCREEN)/2)+iXPos); fYPos = (GetSystemMetrics(SM_CYSCREEN)/2)-fYSize-iYPos; // Move the sprite matWorld._41 = fXPos; // X matWorld._42 = fYPos; // Y // Поток, формат, индексный буфер pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) ); pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); pDirect3DDevice->SetIndices(pBufferIndex); // Установки для первой текстуры pDirect3DDevice->SetTexture (0, pTextura001); pDirect3DDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); pDirect3DDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); } void vRender( void ) { int iX; int iY; int iCurTile; int iBufferPos; char szOutput[ 256 ]; if(pDirect3DDevice == NULL) // Проверяем ошибки return; // Чистим задний буфер pDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET| D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(60,100,150), 1.0f, 0 ); // Начало сцены, здесь происходит прорисовка сцены pDirect3DDevice->BeginScene(); // Свет и материал LightMaterial(); // Матрицы Matrix(); // Top to bottom for( iY = 0; iY < g_iTilesHigh; iY++ ) { // Left to right for( iX = 0; iX < g_iTilesWide; iX++ ) { // Calculate buffer offset iBufferPos = iX+g_iXPos+((iY+g_iYPos)*g_iMapWidth); // Get the proper tile iCurTile = g_iTileMap[ iBufferPos ]; // Display the tile RenderingDirect3D( ( iX * g_iTileSize ), ( iY * g_iTileSize ), (float)g_iTileSize, (float)g_iTileSize, iCurTile ); } } // Вывод объекта pDirect3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 36, 0, 12); // Вывод текста DrawMyText(pDirect3DDevice, hFont,"Урок 11\nМультитекстурирование\nДля выхода нажмите клавишу Esc ", 10,10,500,700,D3DCOLOR_ARGB(250,250,250,50)); // Конец сцены pDirect3DDevice->EndScene(); // Выводим на экран pDirect3DDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------------- // Функция // DeleteDirect3D() // Освобождает захваченные ресурсы //----------------------------------------------------------------------------------- VOID DeleteDirect3D() { if( pTextura002 != NULL ) pTextura002->Release(); if( pTextura001 != NULL ) pTextura001->Release(); if( pBufferIndex != NULL) pBufferIndex->Release(); if( pBufferVershin != NULL) pBufferVershin->Release(); if( pDirect3DDevice != NULL) pDirect3DDevice->Release(); if( pDirect3D != NULL) pDirect3D->Release(); } //----------------------------------------------------------------------------------- // Функция // MainWinProc() // Здесь происходит обработка сообщений //----------------------------------------------------------------------------------- LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { switch(msg) { case WM_DESTROY: { DeleteDirect3D(); PostQuitMessage(0); return(0); } case WM_KEYDOWN: { if(wparam==VK_ESCAPE) PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wparam, lparam); }
Global_Includes.h window.cpp
#include "Dezmond_Graphic.h" //----------------------------------------------------------------------------------- // Функция // WinMain // Входная точка приложения //----------------------------------------------------------------------------------- int WINAPI WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX windowsclass; // Создаем класс HWND hwnd; // Создаем дескриптор окна MSG msg; // Идентификатор сообщения // Определим класс окна WNDCLASSEX windowsclass.cbSize = sizeof(WNDCLASSEX);// Размер всей структуры windowsclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;//Задание стиля окн windowsclass.lpfnWndProc = MainWinProc;//Наша функция обработки событий windowsclass.cbClsExtra = 0; windowsclass.cbWndExtra = 0; windowsclass.hInstance = hinstance;//Экземпляр приложения windowsclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); windowsclass.hCursor = LoadCursor(NULL, IDC_ARROW); windowsclass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//цвет фона windowsclass.lpszMenuName = NULL;//имя меню windowsclass.lpszClassName = L"WINDOWSCLASS";//Имя класса окна windowsclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // Зарегистрируем класс if (!RegisterClassEx(&windowsclass)) return(0); // Теперь когда класс зарегестрирован можно создать окно if (!(hwnd = CreateWindowEx(NULL, // стиль окна L"WINDOWSCLASS", // класс 0, // название окна WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // левый верхний угол GetSystemMetrics(SM_CXSCREEN),// ширина GetSystemMetrics(SM_CYSCREEN),// высота NULL, // дескриптор родительского окна NULL, // дескриптор меню hinstance, // дескриптор экземпляра приложения NULL))) // указатель на данные окна return 0; if( SUCCEEDED( InitialDirect3D( hwnd ) ) ) { if( SUCCEEDED( InitialObject( ) ) ) { 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 vRender(); } } } return 0; }
Добавлено (30.10.2012, 01:01) --------------------------------------------- в результате должна быть тайловая карта
Добавлено (30.10.2012, 22:30) --------------------------------------------- попытался изменить матрицу вершин,но не какого результата
Я белый и пушистый но имею когти и зубы
Сообщение отредактировал redinard - Вторник, 30 Октября 2012, 01:00