netlib.narod.ru< Назад | Оглавление | Далее >

1.5. Пример приложения: инициализация Direct3D

В рассматриваемом в этой главе примере мы выполним инициализацию Direct3D-приложения и очистим экран, заполнив его черным цветом (рис. 1.7).


Рис. 1.7. Окно программы, рассматриваемой в этой главе

Рис. 1.7. Окно программы, рассматриваемой в этой главе


Этот пример, как и все другие примеры в этой книге, использует код из файлов d3dUtility.h и d3dUtility.cpp, которые можно скачать с веб-сайта, посвященного этой книге. Эти файлы содержат функции, реализующие общие задачи, которые должно выполнять каждое Direct3D-приложение, такие как создание окна, инициализация Direct3D и вход в цикл обработки сообщений. Благодаря созданию функций-оберток для этих задач, в коде примеров мы можем сосредоточиться на рассматриваемой в соответствующей главе теме. Кроме того, на протяжении книги мы будем добавлять к этим файлам полезный вспомогательный код.

1.5.1. Файлы d3dUtility.h/cpp

Перед тем, как перейти к примеру из этой главы, давайте потратим немного времени, чтобы познакомиться с функциями, предоставляемыми файлами d3dUtility.h/cpp. Вот как выглядит код из файла d3dUtility.h:

// Включение основного заголовочного файла Direct3DX. В нем осуществляется
// включение других, необходимых нам заголовочных файлов Direct3D.
#include <d3dx9.h>

namespace d3d
{
    bool InitD3D(
         HINSTANCE hInstance,        // [in] Экземпляр приложения.
         int width, int height,      // [in] Размеры вторичного буфера.
         bool windowed,              // [in] Оконный (true) или
                                     //      полноэкранный (false) режим.
         D3DDEVTYPE deviceType,      // [in] HAL или REF
         IDirect3DDevice9** device); // [out] Созданное устройство.

    int EnterMsgLoop(
         bool (*ptr_display)(float timeDelta));

    LRESULT CALLBACK WndProc(
         HWND hwnd,
         UINT msg,
         WPARAM wParam,
         LPARAM lParam);

    template<class T> void Release(T t)
    {
        if(t)
        {
            t->Release();
            t = 0;
        }
    }

    template<class T> void Delete(T t)
    {
        if(t)
        {
            delete t;
            t = 0;
        }
    }
}

1.5.2. Каркас примера

Под каркасом примера мы подразумеваем общую структуру кода, которой придерживаются все рассматриваемые в этой книге примеры программ. Для каждого приложения мы в обязательном порядке будем реализовать три функции, не считая процедуры обработки сообщений и функции WinMain. В этих трех функциях будет реализоваться код, специфичный для конкретного приложения. Вот эти функции:

1.5.3. Приложение D3D Init

Как было сказано, рассматриваемый пример приложения создает и инициализирует Direct3D-приложение и очищает экран, заполняя его черным цветом. Обратите внимание, что для упрощения инициализации мы используем наши вспомогательные функции. Полный код проекта можно скачать с веб-сайта этой книги.

ПРИМЕЧАНИЕ
Рассматриваемый пример иллюстрирует те же идеи, что и урок Tutorial 1 из документации DirectX SDK. Завершив чтение этой главы, вы можете прочесть урок Tutorial 1, чтобы познакомиться с другой точкой зрения.

Мы начинаем с включения заголовочного файла d3dUtility.h и объявления глобальной переменной для устройства:

#include "d3dUtility.h"
IDirect3DDevice9* Device = 0;

Затем мы реализуем функции, входящие в каркас приложения:

bool Setup()
{
    return true;
}
void Cleanup()
{

}

В данном примере нам не требуются никакие ресурсы, так что методы Setup и Cleanup остаются пустыми.

bool Display(float timeDelta)
{
    if(Device)
    {
        Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                      0x00000000, 1.0f, 0);
        Device->Present(0, 0, 0, 0); // показ вторичного буфера
    }
    return true;
}

Метод Display вызывает метод IDirect3DDevice9::Clear, который очищает вторичный буфер и буфер глубины/трафарета, заполняя их черным цветом и константой 1.0 соответственно. Обратите внимание, что если приложение не остановлено, мы выполняем только код рисования. Объявление функции IDirect3DDevice9::Clear выглядит так:

HRESULT IDirect3DDevice9::Clear(
     DWORD Count,
     const D3DRECT* pRects,
     DWORD Flags,
     D3DCOLOR Color,
     float Z,
     DWORD Stencil
);

После того, как поверхность очищена, мы показываем вторичный буфер, вызвав метод IDirect3DDevice9::Present.

Оконная процедура обрабатывает пару событий, а именно позволяет выходить из приложения, нажав клавишу Esc.

LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam,
                              LPARAM lParam)
{
    switch( msg )
    {
    case WM_DESTROY:
         ::PostQuitMessage(0);
         break;

    case WM_KEYDOWN:
         if( wParam == VK_ESCAPE )
             ::DestroyWindow(hwnd);
         break;
    }
    return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

Функция WinMain выполняет следующие действия:

  1. Инициализирует главное окно и Direct3D.
  2. Вызывает процедуру Setup для инициализации приложения.
  3. Запускает цикл обработки сообщений, указав в качестве функции визуализации функцию Display.
  4. Освобождает выделенные приложению ресурсы и объект IDirect3DDevice9.
int WINAPI WinMain(HINSTANCE hinstance,
                   HINSTANCE prevInstance,
                   LPSTR cmdLine,
                   int showCmd)
{
    if(!d3d::InitD3D(hinstance, 800, 600,
                  true, D3DDEVTYPE_HAL, &Device))
    {
        ::MessageBox(0, "InitD3D() - FAILED", 0, 0);
        return 0;
    }

    if(!Setup())
    {
        ::MessageBox(0, "Setup() - FAILED", 0, 0);
        return 0;
    }

    d3d::EnterMsgLoop( Display );

    Cleanup();

    Device->Release();

    return 0;
}

Как видите, благодаря вспомогательным функциям выполняющим обработку сообщений и инициализацию Direct3D, структура шаблона приложения получилась исключительно прозрачной.

Для большинства примеров из этой книги наша задача будет заключаться в написании реализаций функций Setup, Cleanup и Display.

ПРИМЕЧАНИЕ
Помните, что для построения данного приложения компоновщику необходимы библиотеки d3d9.lib, d3dx9.lib и winmm.lib.

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz