Читаем Графика DirectX в Delphi полностью

if Failed (hRet) then ErrorOut(hRet, 'DDReLoadBitmap');

hRet := FDDSImage2._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := DDReLoadBitmap(FDDSImage2, starBmp2);

if Failed (hRet) then ErrorOut(hRet, 'DDReLoadBitmap');

hRet := FDDSImagel._Restore;

if Failed (hRet) then begin

Result := hRet;

Exit;

end;

hRet := DDReLoadBitmap(FDDSImage1, starBmpl);

if Failed (hRet)

then ErrorOut(hRet, 'DDReLoadBitmap');

Result := DD_OK

end else Result := hRet;

end;

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

Игра "Меткий стрелок"

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

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

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

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

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

В игре присутствует два вида чудовищ, после попадания в монстра пули на месте трагедии остается огненный сполох (рис. 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;

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
Adobe InDesign CS3
Adobe InDesign CS3

Книга посвящена верстке и макетированию в программе Adobe InDesign CS3. Помимо того что в ней описываются возможности программы, рассматриваются также принципы и традиции верстки, приводятся примеры решения типичных задач. Все это позволит читателю не только овладеть богатым инструментарием программы, но и грамотно применять его.Материал книги разделен на логические части: теоретические сведения, инструментарий программы, решение задач, – а также рассчитан на два уровня подготовки читателей – начинающих и опытных пользователей, что выгодно отличает книгу от других изданий. Это позволит применять ее как новичкам для знакомства с программой, так и пользователям со стажем для пополнения своих знаний.

Владимир Гавриилович Завгородний , Владимир Завгородний

Программирование, программы, базы данных / Программное обеспечение / Книги по IT
Разработка приложений в среде Linux. Второе издание
Разработка приложений в среде Linux. Второе издание

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет СЃРѕР±РѕР№ отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из РґСЂСѓРіРёС… операционных систем. РџРѕРґСЂРѕР±но рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование СЃРІРѕР±одно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Р

Майкл К. Джонсон , Эрик В. Троан

Программирование, программы, базы данных