Чтение онлайн

на главную - закладки

Жанры

Графика для Windows средствами DirectDraw

Трухильо Стэн

Шрифт:

Fatal(msg);

 }

 surf->SetColorKey(DDCKEY_SRCBLT, &ddck);

 sprite[nsprites++]=new Sprite(surf, 300, 0);

 sprite[nsprites++]=new Sprite(surf, 300, 150);

 text=CreateSurface("text.bmp");

 if (text==0) {

msg+="text.bmp";

Fatal(msg);

 }

 text->SetColorKey(DDCKEY_SRCBLT, &ddck);

 return TRUE;

}

Функция CreateCustomSurfaces

«раскручивает» генератор случайных чисел с помощью функции time, возвращающей системное время в секундах. Благодаря этому при каждом запуске программы будут генерироваться разные случайные числа.

Затем для каждой создаваемой поверхности готовится структура DDCOLORKEY. Для всех поверхностей этого приложения прозрачным является черный цвет (то есть нулевое значение).

Функция создает четыре поверхности, и по каждой поверхности — два спрайта. Если хотя бы один из BMP-файлов, по которым создаются поверхности, не будет найден, функция Fatal выводит сообщение и завершает программу. Для успешно созданных поверхностей с помощью функции SetColorKey интерфейса DirectDrawSurface активизируются цветовые ключи.

Наконец, поверхность меню text инициализируется содержимым файла TEXT.BMP. Функция SetColorKey, как и в случае спрайтовых поверхностей, определяет прозрачный цвет. Код возврата TRUE является признаком успешного завершения. 

Функция DrawScene 

Инициализация приложения завершена, теперь можно заняться функцией DrawScene. Эта функция выполняет проверку столкновений, строит кадр во вторичном буфере и переключает страницы. В программе Bumper функция DrawScene выглядит так:

void BumperWin::DrawScene {

 ASSERT(nsprites>0);

 ASSERT(text);

 for (int s1=0;s1<nsprites;s1++) for (int s2=s1+1;s2>nsprites;s2++) if (SpritesCollide(sprite[s1], sprite[s2])) {

sprite[s1]->Hit(sprite[s2]);

sprite[s2]->Hit(sprite[s1]);

 }

 for (int i=0;i<nsprites;i++) sprite[i]->Update;

 ClearSurface(backsurf, 0);

 for (i=0;i<nsprites;i++) {

Sprite* s=sprite[i];

BltSurface(backsurf, *s, s->GetX, s->GetY, TRUE);

 }

 BltSurface(backsurf, text, 0, 448, TRUE);

 primsurf->Flip(0, DDFLIP_WAIT);

}

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

спрайта. Напомню, что функция Sprite::Hit реализует стадию подтверждения в нашей модели проверки столкновений. Она сохраняет данные о столкновении, но не вносит никаких изменений в состояние спрайтов.

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

После того как все столкновения будут обнаружены и обработаны, мы стираем вторичный буфер функцией DirectDrawWin::ClearSurface и выводим каждый спрайт функцией BltSurface. Обратите внимание на то, что вторым аргументом BltSurface является указатель на сам объект Sprite. В данном случае оператор LPDIRECTDRAWSURFACE преобразует объект Sprite в указатель на поверхность, соответствующую данному спрайту. Также стоит заметить, что координаты спрайтов определяются функциями GetX и GetY. После прорисовки всех спрайтов в левом нижнем углу вторичного буфера выводится поверхность меню. Функция Flip переключает страницы и отображает кадр на экране. 

Функция OnKeyDown 

Как видно из меню, программа Bumper реагирует на две клавиши: пробел и Escape. Нажатие пробела приводит к тому, что векторы направлений каждого спрайта пересчитываются заново, а Escape завершает работу программы. Функция OnKeyDown выглядит так:

void BumperWin::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) {

 switch (nChar) {

 case VK_ESCAPE:

PostMessage(WM_CLOSE);

break;

 case VK_SPACE:

 case VK_RETURN:

for (int i=0;i<nsprites;i++) sprite[i]->CalcVector;

break;

 }

 DirectDrawWin::OnKeyDown(nChar, nRepCnt, nFlags);

}

Восстановление потерянных поверхностей 

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

void BumperWin::RestoreSurfaces {

 for (int i=0;i<nsprites;i++) sprite[i]->GetSurf->Restore;

 LoadSurface(*sprite[0], "diamond.bmp");

 LoadSurface(*sprite[1], "diamond.bmp");

 LoadSurface(*sprite[2], "triangle.bmp");

 LoadSurface(*sprite[3], "triangle.bmp");

 LoadSurface(*sprite[4], "rect.bmp");

 LoadSurface(*sprite[5], "rect.bmp");

Поделиться:
Популярные книги

Флеш Рояль

Тоцка Тала
Детективы:
триллеры
7.11
рейтинг книги
Флеш Рояль

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.20
рейтинг книги
Ученик

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Вперед в прошлое 10

Ратманов Денис
10. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 10

Волхв пятого разряда

Дроздов Анатолий Федорович
2. Ледащий
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Волхв пятого разряда

Кодекс Крови. Книга Х

Борзых М.
10. РОС: Кодекс Крови
Фантастика:
фэнтези
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга Х

Осознание. Пятый пояс

Игнатов Михаил Павлович
14. Путь
Фантастика:
героическая фантастика
5.00
рейтинг книги
Осознание. Пятый пояс

Леди Малиновой пустоши

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.20
рейтинг книги
Леди Малиновой пустоши

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Господин следователь 6

Шалашов Евгений Васильевич
6. Господин следователь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Господин следователь 6

Тепла хватит на всех

Котов Сергей
1. Миры Пентакля
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Тепла хватит на всех

Отмороженный 4.0

Гарцевич Евгений Александрович
4. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 4.0