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

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

Жанры

Графика DirectX в Delphi

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

Шрифт:

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

Чудовища мечутся по экрану, отталкиваясь друг от друга и от границ окна (предел нижней границы области перемещений монстров чуть

выше нижней границы окна).

Несмотря на свой ужасный вид, монстры вполне безобидны и не приносят никому никакого вреда.

В игре присутствует два вида чудовищ, после попадания в монстра пули на месте трагедии остается огненный сполох (рис. 5.2).

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

Код построен на основе примера из предыдущей главы с проверкой столкновений. Класс TBaseSprite является базовым для других классов спрайтов. Следуя логике предыдущих примеров, каждый объект имеет собственную поверхность:

type

TBaseSprite = class

FSpriteSurface г IDirectDrawSurface?; // Поверхность

PosX, PosY : Integer; // Позиция

SpriteWidth : Integer; // Размеры

SpriteHeight. : Integer;

function GetRect : TRect; // Охватывающий прямоугольник

procedure Show; virtual; abstract; // Вывод private

rcRect : TRect; // Прямоугольник кадра

end;

Фон загружается из отдельного растра, все остальные образы берутся из компонентов класса Timage (рис. 5.3).

Классы воина, монстров и пуль являются дочерними базового класса:

type

TWarrior = class (TBaseSprite) // Класс воина

Direction : (dirLeft, dirRight); // Два направления

constructor Create (const Image : TImage); // Конструктор

function Restore (const Image : TImage) : HRESULT; // Восстановление

// Метод вывода определяется в каждом дочернем классе

procedure Show; override;

end;

Обратите внимание, что каждая пуля в моей игре является отдельным спрайтом:

type

TBullet = class (TBaseSprite)

Delay : DWORD; // Задержка, задает скорость

полета пуль

constructor Create (const Image : Tlmage);

function Restore (const Image : Tlmage) : HRESULT;

procedure Show; override; // Вычисление нового положения и вывод

private

Xinc : Integer; // Наращивание по каждой оси

Yinc : Integer;

ThisTickCount : DWORD; // Локальный таймер для каждого спрайта

LastTickCount : DWORD;

end;

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

type

TCollidelnfo = record

X, Y : Integer;

end;

TSprite = class (TBaseSprite)

Delay : DWORD;

AnimFrame : Integer; // Текущий кадр

FrameCount : Integer; // Всего кадров для этого вида монстров

Collide : BOOL;

Live : BOOL; // Флаг, сигнализирующий, не убит ли монстр

constructor Create (const Image : Tlmage; const SprDelay : DWORD;

const FrmCount : Integer);

function GetCenterX : Integer;

function GetCenterY : Integer;

function Restore : HRESULT;

procedure CalcVector;

procedure Hit(S : TSprite);

procedure Show; override; // Вычисление нового положения и вывод private

Xinc : Integer;

Yinc : Integer;

Collidelnfo : TCollidelnfo;

ThisTickCount : DWORD;

LastTickCount : DWORD;

end;

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

const

DelayMonsters = 1000;// Через сколько миллисекунд появится новый монстр

MaxSprites = 100; // Ограничение количества спрайтов

var

Monsters : Array [0..MaxSprites - 1] of TSprite; // Массив чудовищ

Bullets : Array [0..MaxSprites - 1] of TBullet; // Массив пуль

Warrior : TWarrior; // Объект бойца

GlobalThisTickCount : DWORD; // Глобальный таймер

GlobalLastTickCount : DWORD;

NumMonsters : Integer =0; // Текущее количество монстров

NumBullets : Integer =0; // Текущее количество пуль

Создание отдельного спрайта (имеющего собственную поверхность) происходит очень долго, поэтому массивы спрайтов заполняются в начале работы приложения. Если же поступать так, как подсказывает логика, и создавать объекты только непосредственно перед их появлением на экране, картинка в такие моменты будет замирать на долю секунды. Создание двух сотен объектов будет долгим. Чтобы скрасить время ожидания, перед началом этого процесса я вывожу на первичную поверхность картинку фона, но можно было бы использовать и специальную заставку:

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

Блуждающие огни 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
рейтинг книги
Камень Книга двенадцатая