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

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

Жанры

Графика DirectX в Delphi

Краснов Михаил

Шрифт:

for wrkJ := wrkl to NumBullets - 1 do // Сдвигаем содержимое массива

with Bullets [wrkJ] do begin

PosX := Bullets [wrkJ + I].PosX;

PosY := Bullets [wrkJ + l].PosY;

Xinc := Bullets [wrkJ + 1].Xinc;

Yinc := Bullets [wrkJ + l].Yinc;

end;

NumBullets := NumBullets - 1;

end;

end;

Положение пули, попавшей в монстра, устанавливается за пределами экрана, чтобы она

не летела дальше, поражая других чудовиш.

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

procedure TfrmDD.DeadMonster (const Number : Integer);

var

DC : HDC;

ddsd : TDDSurfaceDesc2;

begin

ZeroMemory (@ddsd, SizeOf(ddsd));

with ddsd do begin

dwSize := SizeOf(ddsd);

dwFlags := DDSD__CAPS or DDSD_HEIGHT or DDSD_WIDTH;

dwHeight := ImgDead.Height;

dwWidth := ImgDead.Width;

ddsCaps.dwCaps := DDSCAPS_OFFSCREENPLAIN;

end;

with Monsters[Number] do begin

// Пересоздаем поверхность (без := nil)

FDD.CreateSurface(ddsd, FSpriteSurface, nil);

// Считаем, что ошибок не будет

FSpriteSurface.GetDC(DC);

// Конкретные числа размеров копируемого образа

BitBlt(DC, 0, 0, 100, 25, ImgDead.Canvas.Handle, О, О, SRCCOPY);

FSpriteSurface.ReleaseDC(DC);

// Ключ необходимо переустановить

DDSetColorKey (FSpriteSurface, RGB(0, 255, 0));

// Опять опираемся на конкретные числа

SpriteHeight := 25;

SpriteWidth := 25;

AnimFrame := 0;

FrameCount := 4;

Xinc := 0; // Погибший спрайт остается неподвижный

Yinc := 0;

Live := False;

end;

end;

Кадр перерисовывается непрерывно, но изменения в нем вносятся в соответствии с принятыми задержками:

function TfrmDD.UpdateFrame : HRESULT;

var

wrkl, si, s2 : Integer;

begin

GlobalThisTickCount := GetTickCount;

// Подошло время выпустить нового монстра

FDDSBack.BltFastfO, 0, FDDSBackGround, @bkRect, DDBLTFAST_WAIT);

if (GlobalThisTickCount - GlobalLastTickCount > DelayMonsters)

and (NumMonsters < High (Monsters) - 1) then begin Inc (NumMonsters);

GlobalLastTickCount := GlobalThisTickCount;

end;

// Обновить положения и воспроизвести монстров

for wrkl := 0 to NumMonsters - 1 do Monsters [wrkl].Show;

Warrior.Show; // Вывод воина поверх пролетающих, монстров

UpdateBul; // Удалить пули, вылетевшие за пределы экрана

//

Обновить положения и отобразить пули

for wrkl := 0 to NumBullets - I do Bullets [wrkl].Show;

// Определить столкновение монстров и пуль

for s1 := 0 to NumMonsters - 1 do

for s2 := 0 to NumBullets - 1 do

if Monsters [s1].Live and SpritesCollidePixel (Monsters [s1],

Bullets [s2]) then begin

// Попавшая пуля перемещается за границы экрана

Bullets [s2].PosY := -10;

DeadMonster (s1); // Заменить образ монстра

end;

// Столкновения монстров, берутся в расчет только живые чудовища

for s1 := 0 to NumMonsters - 2 do

for s2 := si + 1 to NumMonsters - 1 do

if Monsters [s1].Live and Monsters [s2].Live and

SpritesCollidePixel (Monsters [si], Monsters[s2]) then begin

Monsters [si].Hit(Monsters [s2]);

Monsters [s2].Hit(Monsters [si]);

end;

Result := DDJDK;

end;

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

Итак, воспроизведение множества спрайтов выполняется с удовлетворительной скоростью. Наиболее слабыми местами этой пробной игры являются чересчур долгая инициализация и восстановление объектов. Также при каждом попадании в чудовище смена цепочки кадров чересчур затягивается, и в такие моменты происходит ощутимое торможение в работе игры.

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

Скорость работы игры повысилась существенно, инициализация и восстановление происходят мгновенно, и нет ощутимой паузы в моментах замены картинки спрайтов.

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

Образы спрайтов хранятся в единственном компоненте класса Timage (рис. 5.5).

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

Блуждающие огни 4

Панченко Андрей Алексеевич
4. Блуждающие огни
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Блуждающие огни 4

Я сделаю это сама

Кальк Салма
1. Магический XVIII век
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Я сделаю это сама

Флеш Рояль

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

Боярышня Дуняша

Меллер Юлия Викторовна
1. Боярышня
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Боярышня Дуняша

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

На границе империй. Том 10. Часть 1

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 1

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Невест так много. Дилогия

Завойчинская Милена
Невест так много
Любовные романы:
любовно-фантастические романы
7.62
рейтинг книги
Невест так много. Дилогия

Идеальный мир для Социопата 3

Сапфир Олег
3. Социопат
Фантастика:
боевая фантастика
6.17
рейтинг книги
Идеальный мир для Социопата 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Наследник павшего дома. Том I

Вайс Александр
1. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том I

Крещение огнем

Сапковский Анджей
5. Ведьмак
Фантастика:
фэнтези
9.40
рейтинг книги
Крещение огнем

Камень Книга двенадцатая

Минин Станислав
12. Камень
Фантастика:
боевая фантастика
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Камень Книга двенадцатая