Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание тайловой карты, помогите создать тайловую карту 
:(
    Опции темы
redinard
Дата 26.10.2012, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0442 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.