Сначала позвольте мне сказать пару слов об Allegro Game Programming Library. Allegro, как например и SDL, это кросс-платформенная игровая библиотека, которая дает возможность использовать графику, окна, аудиосистему, таймеры и обработку ввода без сложных манипуляций с API операционной системы. Если вы хотите узнать больше об Allegro, вы можете посетить сайт сообщества Allegro, нажав здесь. Ну а теперь поехали!

Что Вам понадобится

* DirectX 9.0 SDK, который вы можете получить на http://www.microsoft.com
* Allegro Game Programming Library, которую вы можете скачать тут: http://www.talula.demon.co.uk/allegro/(Мы будем использовать версию 4.03 stable, но и более поздние версии могут работать). Если вы хотите получить готовую версию 4,03 Вы можете получить ее на http://www.allegro.cc, просто нажмите на «Files» в левом верхнем углу сайта.
* Microsoft Visual C + + (Мы будем использовать версию 6.0, но и другие версии могут работать)

Для этого урока мы будем подражать демонстрационному примеру Mesh из учебника DirectX SDK 9.0.

Мы будем использовать файл Tiger.X, использованный Microsoft в примере для учебника DX9.

Псевдокод

В принципе, вот что наша программа будет делать:

1. Инициализация Allegro
2. Инициализация DirectX
3. Нагрузка данных Mesh’а (файл X)
4. Установка ориентации
5. Рендер данных Mesh
6. После нажатия клавиши рендеринг останавливается
7. Затем мы освобождаем все ресурсы
8. Выход из программы

Определения, инклуды и библиотеки

Так как мы запускаем Allegro в windows-среде, мы должны объявить прежде всего это:

#define ALLEGRO_NO_MAGIC_MAIN

 

Это значит, мы не будем использовать формат Allegro int main(void), вместо этого мы будем использовать этот формат точки входа:

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT)

 

Далее мы должны включать следующее:

#include <allegro.h>           // хидер allegro
#include <winalleg.h>          // Windows-specific хидер allegro
#include <d3d9.h>              // хидер direct x
#include <d3dx9.h>             // хидер d3dx utility

 

Затем мы должны прилинковать файлы alleg.lib, d3d9.lib и d3dx9.lib или определить их как ярлык:

#pragma comment(lib, «alleg.lib»)
#pragma comment(lib, «d3dx9.lib»)
#pragma comment(lib, «d3d9.lib»)

Allegro

В этом разделе мы обсудим все методы Allegro, связанные в демонстрационной программой.

Так как мы будем использовать функции таймера Allegro, мы также должны определить это:

DWORD g_nCounter = 0;

void my_timer_handler()      {
g_nCounter++;
}

 

Это будет работать так же, как привычный timeGetTime() в версии SDK-демо; g_nCounter будет увеличиваться на 1 каждый раз при вызове обработчика.

Вот наша функция для инициализации аллегро. Мы должны инициализировать аллегро до инициализации DirectX. Мы будем использовать видео режим 800×600.

int StartAllegro(void) {
allegro_init();           // start allegro// Создаём окно, которое сможет использоваться DirectX. Если вы не
// создадите его, функционал обработки ввода Allegro работать не будет
if (set_gfx_mode(GFX_DIRECTX_WIN, 800, 600, 0, 0) < 0) {
MessageBox(win_get_window(), allegro_error, «Error setting video mode», MB_OK);
return 1;
}
// Кстати, вы можете использовать опцию GFX_GDI вместо GFX_DIRECTX_WINinstall_timer();     // мы будем использовать функционал таймера allegro
install_keyboard();  // мы также будем использовать функционал обработки клавиатуры allegro
install_mouse();     // чтобы скрыть указатель мыши, сначала нужно вызвать это
show_mouse(NULL);    // а затем скрыть указатель

// мы будем вызывать my_timer_handler() каждую 1 мс., что заставит g_nCounter
// работать точно также, как timeGetTime()
install_int(my_timer_handler, 1);
return 0;
}

 

Вот наш основной цикл:

while(!keypressed())  {             // keypressed — функция Allegro, аналагичная kbhit(), она
// возвращает true, пока клавиша нажатаSetupMatrices(); // устанавливаем ориентацию// чистим бэкбуфер и z-буфер
g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );

// начинаем сцену
if(SUCCEEDED(g_pd3dDevice->BeginScene()))     {

RenderX(); // рендерим нашу модель

// завершаем сцену
g_pd3dDevice->EndScene();
}

// выводим содержимое бэкбуфера на экран
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

DirectX

В этом разделе мы обсудим все методы, связанные с DirectX в демонстрационной программе.

Это необходимо нашего примера:

LPDIRECT3D9 g_pD3D = NULL;  / / Используется для создания D3DDevice
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; / / Наше устройство рендера
LPD3DXMESH g_pMesh = NULL; / /  наш обьект Mesh
D3DMATERIAL9 * g_pMeshMaterials = NULL; / / Материалы для нашего Mesh
LPDIRECT3DTEXTURE9 * g_pMeshTextures = NULL; / / текстуры для него
DWORD g_dwNumMaterials = 0L; / /  Число материалов меша

 

Вот функция инициализации Direct X, мы будем использовать видео режим 800×600.

int StartDirectX(void)    {
D3DPRESENT_PARAMETERS d3dpp;//creating direct3D object
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if    (g_pD3D == NULL)    {
MessageBox(win_get_window(),«Error Creating Direct3D Object»,«D3D Object Error»,MB_OK);
return 1;
}// установка параметров, необходимых для создания устройства d3d
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = false;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil = true;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.hDeviceWindow = win_get_window();
d3dpp.BackBufferWidth = 800;
d3dpp.BackBufferHeight = 600;
d3dpp.BackBufferFormat = D3DFMT_R5G6B5;
d3dpp.MultiSampleType = D3DMULTISAMPLE_NONE;

// создание устройства direct3D
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, win_get_window(),
D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice)))    {
MessageBox(win_get_window(),«Error Creating Direct3D Device»,«D3D Device    Error»,MB_OK);
return 1;
}

// Включаем Z-буфер
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

// Включаем рассеянное освещение
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );

return 0;
}

 

Мы использовали функцию Allegro win_get_window() в этом коде, чтобы иметь возможность использовать окно DirectX, созданное Allegro.

Эта простая функция будет загружатьmech .X .

int LoadX(char *szFile)        {

}

 

Это установит ориентацию нашей модели в кадре. Тут нет ничего особенного за исключением того, что мы использовали g_nCounter вместо timeGetTime().

void SetupMatrices(void)     {

D3DXMatrixRotationY( &matWorld, g_nCounter/1000.0f );

}

 

Эта процедура освободит все ресурсы, которые мы использовали, и завершит программу:

void EndDirectX(void)          {

}

 

Вы можете скачать полное демо тут.

Надеюсь, этот урок помог кому-нибуть.