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

9.1. ID3DXFont

Библиотека D3DX предоставляет интерфейс ID3DXFont, который можно использовать для отображения текста в Direct3D-приложениях. Этот интерфейс использует для отображения текста GDI и его применение может значительно уменьшить быстродействие приложения. Однако, поскольку ID3DXFont использует GDI, он поддерживает сложные шрифты и форматирование.

9.1.1. Создание ID3DXFont

Для создания интерфейса ID3DXFont может использоваться функция D3DXCreateFontIndirect.

HRESULT D3DXCreateFontIndirect(
     LPDIRECT3DDEVICE9 pDevice, // устройство, связанное со шрифтом
     CONST LOGFONT* pLogFont,   // структура LOGFONT, описывающая шрифт
     LPD3DXFONT* ppFont         // возвращает созданный шрифт
);

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

LOGFONT lf;
ZeroMemory(&lf, sizeof(LOGFONT));
lf.lfHeight    = 25;    // в логических единицах
lf.lfWidth     = 12;    // в логических единицах
lf.lfWeight    = 500;   // насыщенность, 
                        // диапазон 0(тонкий) - 1000(жирный)
lf.lfItalic    = false;
lf.lfUnderline = false;
lf.lfStrikeOut = false;
lf.lfCharSet   = DEFAULT_CHARSET;
strcpy(lf.lfFaceName, "Times New Roman"); // гарнитура шрифта

ID3DXFont* font = 0;
D3DXCreateFontIndirect(Device, &lf, &font);

Обратите внимание, что сперва требуется заполнить структуру LOGFONT, которая описывает параметры создаваемого шрифта.

ПРИМЕЧАНИЕ
Для получения указателя на интерфейс ID3DXFont вы можете также воспользоваться функцией D3DXCreateFont.

9.1.2. Рисование текста

После того, как мы получили указатель на интерфейс ID3DXFont, рисование текста осуществляется простым вызовом метода ID3DXFont::DrawText.

INT ID3DXFont::DrawText(
     LPCSTR pString,
     INT Count,
     LPRECT pRect,
     DWORD Format,
     D3DCOLOR Color
);

Вот пример использования метода:

Font->DrawText(
     "Hello World",    // Выводимая строка
     -1,               // Строка завершается нулевым символом
     &rect,            // Прямоугольная область для рисования строки
     DT_TOP | DT_LEFT, // Рисуем в верхнем левом углу области
     0xff000000);      // Черный цвет

9.1.3. Вычисление частоты кадров

Примеры приложений к этой главе ID3DXFont и CFont вычисляют и отображают количество визуализируемых за секунду кадров (FPS). В этом разделе мы покажем как вычисляется FPS.

Сперва мы объявляем три глобальных переменных:

DWORD FrameCnt;    // Количество выведенных кадров
float TimeElapsed; // Прошедшее время
float FPS;         // Частота визуализации кадров

Мы вычисляем FPS каждую секунду; это дает нам достоверное среднее значение. Кроме того, мы храним вычисленное значение частоты кадров в течение одной секунды, что дает достаточно времени, чтобы прочитать его перед очередным изменением.

Итак, каждый кадр мы увеличиваем значение переменной FrameCnt и прибавляем к переменной TimeElapsed время, прошедшее с вывода предыдущего кадра:

FrameCnt++;
TimeElapsed += timeDelta;

где timeDelta — это время, прошедшее между двумя кадрами.

После того, как пройдет одна секунда, мы вычисляем частоту кадров по следующей формуле:

FPS = (float)FrameCnt / TimeElapsed;

Затем мы обнуляем переменные FrameCnt и TimeElapsed и начинаем вычисление среднего значения частоты кадров для следующей секунды. Вот как выглядит весь код вместе:

void CalcFPS(float timeDelta)
{
     FrameCnt++;
     TimeElapsed += timeDelta;

     if(TimeElapsed >= 1.0f)
     {
          FPS = (float)FrameCnt / TimeElapsed;
          TimeElapsed = 0.0f;
          FrameCnt = 0;
     }
}

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

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