В исходный код инициализации DirectDraw необходимо добавить следующие две строчки:
Пример кода загрузки палитры в DirectDraw
...................... lpDDPal = LoadPaletteFromDibFile(lpDD, szBitmap); // Создадим и Получим указатель на палитру if (lpDDPal) lpDDSPrimary->SetPalette(lpDDPal); // и установим эту палитру для первичной видео поверхности .................... |
5. Настройка прозрачного цвета
В DirectDraw
возможно использование прозрачного цвета(ов) (входа в палитру (color key)) используемого при копировании с поверхности на поверхность. Обычно для этого задается диапазон цветов (входов в палитру), которые не переносятся при копировании (Blt функциях).
Пример кода установки прозрачных цветов в DirectDraw
// Установим прозрачный цвет для данного изображения . // DDCOLORKEY ddColorKey; ddColorKey.dwColorSpaceLowValue = 0xff; // весь диапазон прозрачности - 255 вход в палитру (обычно он черный) ddColorKey.dwColorSpaceHighValue = 0xff; // Далее необходимо сделать что-то типа для вех поверхностей (изображений ) для которых нужен эффект // прозрачности при выполнении операций копирования [Имя указателя на DirectDraw поверхность]->SetColorKey( DDCKEY_SRCBLT, &ddck ); |
7. Собрать все вместе и готово. Построение динамики.
Теперь осталось только организовать цикл по обновлению вторичной поверхности и после его обновления проведения смены экранов (Flip) . Этот цикл лучше всего организовывать на цикле обработки сообщений Вашего приложения (OnIdle), таким образом Вы получите максимальную производительность для конкретной машины на которой выполняется ваше приложение. Сажать это на таймер я не советую - Вам просто будет сложно разобраться и все так подогнать, чтобы с одной стороны по максимуму использовать возможности машины, а с другой не перегружать очередь сообщений. Для общей синхронизации разумно использовать функции мультимедиа типа функции timeGetTime() которая выдает время в мс. Также учтите что чем больше нитей (THREAD) Вы организуете для обеспечения расчетов расположения изображений тем сложнее Вам будет добиться плавности (Windows 95 совсем не многозадачка с вытеснением и квантом времени я не нашел как управлять). Единственное ,что можно использовать для увеличения плавности - Sleep(0) для текущей нити приложения. Но это о другом - просто лирическое отступление - плач по отсутствию возможностей.