ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX


Интерфейс DirectDraw - часть 18


pdc-»SelectObject (pbrOld) ;

sprite.ReleaseDC(pdc) ;

// Задать черньй цвет в качестве цветового ключа

/b> Глава 12. Интерфейс DirectDraw

DDCOLORKEY ck;

ck.dwColorSpaceLowValue =0; // Черный ck.dwColorSpaceHighValue = 0;

sprite.SetColorKey(DDCKEY_SRCBLT, &ck) ;

Я создал поверхность, размер которой равен размеру спрайта (сх х су) и затем воспользовался функциями GDI, чтобы заполнить поверхность черным цветом и нарисовать красный круг. Поскольку цветовым-ключом поверхности задан черный цвет, при выводе спрайта рисуется только красный круг. Признаюсь, здесь я немного смошенничал и выбрал черный цвет в качестве цветового ключа лишь потому, что 0 соответствует черному цвету независимо от того, как его рассматривать — как RGB-значение или индекс палитры.

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

// Закрасить буфер белым цветом CDC* pdc = pBB-»GetDC() ;

ASSERT(pdc) ;

pdc-»PatBlt (rcBack. left,

rcBack.top,

rcBack.right — rcBack.left,

rcBack.bottom — rcBack.top, i

WHITENESS) ;

// Вывести текст pdc-»DrawText (buf,

-1,

SrcBack,

DT_CENTER ¦ DT_BOTTOM ¦ DTJ3INGLELINE) ;

pBB-»Relea5eDC (pdc) ;

// Вывести спрайт RECT rcDst;

rcDst.left = x;

rcDst.top = y;

rcDst.right = rcDst.left + ex;

rcDst.bottom = rcDst.top + cy;

RECT rcSrc;

rcSrc.left = 0;

rcSrc.top = 0;

rcSrc.right = rcSrc.left + ex;

rcSrc.bottom = rcSrc.top + cy;

// Вызвать Bit с цветовым ключом pBB-»Blt (SrcDst, Ssprite, SrcSrc, DDBLT WAITIDDBLT KEYSRC) ;

Работа с DirectDraw

/b>

Перед тем как копировать спрайт во вторичный буфер, мы с помощью функции GDI закрашиваем буфер белым цветом и выводим строку с количеством кадров в секунду. Обратите внимание на то, что среди аргументов функции Bit имеется флаг DDBLT_KEYSRC, который указывает ей на необходимость использования цветового ключа поверхности-источника. Для того чтобы прозрачные области обрабатывались правильно, необходимо задать цветовой ключ в поверхности-источнике и указать этот флаг. Я провел пять или шесть часов в недоумении, пока не догадался включить флаг DDBLT_KEYSRC в вызов функции Bit. Что тут можно сказать? Видимо, я соображаю недостаточно быстро.




Начало  Назад  Вперед



Книжный магазин