Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по DirectX

  Все выпуски  

Уроки по DirectX


Информационный Канал Subscribe.Ru

Direct3D для Visual C++. Рассылки сайта progs.biz  
Начало > DirectX > Direct3D > VC++.NET > Урок 3

А. Ламот. Программирование трехмерных игр для Window.
А. Ламот. Программирование трехмерных игр для Window
Заказать на Озоне


Полные версии уроков (с картинками): урок 3.

Direct3D для Visual C++
Урок 3. Создание устройства для рисования

На прошлом уроке мы сделали окно.

На этом уроке мы создадим устройство для рисования.

Сначала добавим в нашу программу необходимый include:

#include <d3d9.h>

Кроме добавления include'a надо еще указать соответствующие lib-файлы. Для этого в IDE Visual C++.NET на вкладке Solution Explorer (или на вкладке Class View) выделяем наш проект, и затем в меню Project выбираем Properties. В появившемся окне Property Pages выбираем Linker, и затем - Input. В поле Additional Dependencies добавляем значение d3dxof.lib dxguid.lib d3dx9dt.lib d3d9.lib.

Теперь объявим 2 глобальные переменные:

// Вспомогательная переменнная для создания устройства.
LPDIRECT3D9 g_pD3D = NULL;
// Само устройство для рисования.
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;

Теперь нам надо написать три функции - InitD3D, Render и Cleanup. Они будут инициализировать устройство, рисовать на нем и освбождать ресурсы в конце программы сответственно. Вот их код:

HRESULT InitD3D( HWND hWnd )
{
    // Создание необходимой для устройства переменной.
    if((g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ))==NULL)
        return E_FAIL; // Выход в случае неудачи.
    
    // Задание параметров для нашего устройства.
    D3DPRESENT_PARAMETERS d3dpp; 
    // Обнуление большинства параметров.
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    d3dpp.Windowed = TRUE; // Устройство будет оконное.
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; 
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    // Непосредственное создание устройства.
    if( FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
        &d3dpp, &g_pd3dDevice)))
    {
        // Если не удалось создать устройство, то выходим.
        return E_FAIL;
    }

    // Если устройство создалось нормально, то выходим.
    return S_OK;
}

VOID Render()
{
    if(g_pd3dDevice == NULL)
        return;
    // Очистка и закраска фона в красный цвет.
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,
        D3DCOLOR_XRGB(255, 0, 0), 1.0f, 0 );
    // Начало отрисовки сцены.
    if(SUCCEEDED(g_pd3dDevice->BeginScene()))
    {
        // Тут будем писать код для рисования.
        //.
        // Конец отрисовки сцены.
        g_pd3dDevice->EndScene();
    }

    // Вывод из следующего буфера на экран.
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}

VOID Cleanup()
{
    // Освобождение ресурсов.
    if( g_pd3dDevice != NULL) 
        g_pd3dDevice->Release();

    if( g_pD3D != NULL)
        g_pD3D->Release();
}

Код этих функций может показаться достаточно запутанным, и отчасти это так и есть. Но такой код надо писать почти всегда для инициализации DirectX, и постепенно мы разберем его весь.

Теперь надо использовать эти функции. Это мы делаем в функции WinMain и оконной процедуре, написанных на прошлом уроке:

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    ...
    hWnd = CreateWindow("My Class", "My title", WS_OVERLAPPEDWINDOW,
        300, 200, 200, 180, NULL, NULL, hInstance, NULL);

    // Если не прошла инициализация, то выходим.
    if(!SUCCEEDED(InitD3D(hWnd)))
    {
        return 0;
    }
    ...
}
LONG WINAPI WndProc(HWND hWnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message){
    // Добавляем обработчик для отрисовки.
    case WM_PAINT:
        Render();
        break;
    case WM_DESTROY:
        // Вызов функции очистки ресурсов.
        Cleanup();
        PostQuitMessage(0);
        break;

Компилируем и запускаем программу. Результатом будет окно с красным фоном.

Рассылки сайта progs.biz
Visual C++, MFC
C# и .NET
VB.NET
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX new!
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
2002-2004 сайт progs.biz
2002-2004 Алексеев Игорь

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.directxlessons
Отписаться

В избранное