Новичок
Профиль
Группа: Участник
Сообщений: 1
Регистрация: 26.10.2012
Репутация: нет Всего: нет
|
здравствуйте,я пытаюсь создать тайловую карту но на моём пути возникают ошибки,помогите их решить вот мой код Dezmond_Graphic.h | Код | #include "Global_Includes.h" //----------------------------------------------------------------------------------- // Глобальные переменные //----------------------------------------------------------------------------------- LPDIRECT3D9 pDirect3D = NULL; // Главный Direct3D обьект LPDIRECT3DDEVICE9 pDirect3DDevice = NULL; // Устройство LPDIRECT3DVERTEXBUFFER9 pBufferVershin = NULL; // Буфер вершин LPDIRECT3DINDEXBUFFER9 pBufferIndex = NULL; // Индексный буфер LPDIRECT3DTEXTURE9 pTextura[32]; // Текст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 pVertices[] = { // 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", &pTextura[32] ) ) ) 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(pVertices), (void**)&pBV, 0 ) ) ) return E_FAIL; //Копируем memcpy( pBV, pVertices, sizeof(pVertices) ); // Разблокируем 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() {RECT rectText; 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();
// Поток, формат, индексный буфер pDirect3DDevice->SetStreamSource( 0, pBufferVershin, 0, sizeof(CUSTOMVERTEX) ); pDirect3DDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); pDirect3DDevice->SetIndices(pBufferIndex); // Установки для первой текстуры pDirect3DDevice->SetTexture (0, pTextura[32]); 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( pTextura[32] != NULL ) pTextura[32]->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); }
// Глобальный массив для карты блоков int g_iTileMap[100]; // 10*10 = 100 ячеек необходимо
// Прототип функции отображения блока void vDisplayTile(int x, int y);
void main() { int x, y;
// Сверху вниз for(y = 0; y < 10; y++) { // Слева направо for (x = 0; x < 10; x++) { // Отображение блока vDisplayTile(x, y); } } }
void vDisplayTile(int x, int y) { int iTile; int tileWidth = 64; int tileHeight = 64; int mapWidth = 10;
// // Вычисляем номер блока, расположенного // по полученным координатам x и y. // iTile = g_iTileMap[(x + (y * mapWidth))];
RenderingDirect3D(iTile, (x * tileWidth), (y * tileHeight)); }
|
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 RenderingDirect3D(); } } } return 0; }
|
Global_Includes.h | Код | #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>//заголовочный файл для работы с системными функциями
// Tile Map Info int g_iTileSize = 32; int g_iTilesWide = 20; int g_iTilesHigh = 15; int g_iMapWidth = 100; int g_iMapHeight = 100; int g_iXPos = 0; int g_iYPos = 0; int g_iTileMap[ 10000 ];
|
Это сообщение отредактировал(а) redinard - 29.10.2012, 11:18
|