Реклама:

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

Первый, второй, десятый...

Давайте решим, как именно будет выглядеть иерархия игровых классов. Во многих играх самый главный и самый верхний класс — ТЕпдз.пе, который описывает графический движок в целом. В нем хранится список всех игровых объектов и вспомогательная игровая информация глобального масштаба (например, номер уровня, настройки графики). Он также представляет общеигровые методы, например Загрузить игру, Перейти на уровень, Сохранить игру и многие другие.

Одновременно может существовать только один объект этого класса, так как и игровой движок у нас один. Есть исключения, например, сетевые серверные движки (йесИсасес!), но они и строятся по другим принципам. Особого смысла в реализации класса ТЕпдз.пе в нашем случае нет. Вы можете создать его как организующий элемент, чтобы вся система была стройной и однозначной. Но особой смысловой нагрузки он нести не будет. Ведь список объектов и все действия с ними "держит" класс ТСЬБсепе. Он в какой-то мере и будет самым верхним классом иерархии. Остальные поля и методы движка реализуйте как обычные переменные и методы главной формы.

Теперь разберемся с другими классами. Если вы плохо представляете себе структуру будущего движка, можете воспользоваться очень простой методикой. Напишите на листочке все игровые объекты в любом порядке (предметы, окружение, героев, любые другие объекты). Под каждым напишите список его свойств и методов. К примеру, какие поля могут быть у объекта Тролль в простом ЗО-асйоп? Жизни, броня (если есть), тип оружия, мана и доступные заклинания. А методы у него могут быть такими: Идти (в качестве параметра "направление"), Идти к (в качестве параметра "конечная точка", здесь пригодятся алгоритмы поиска путей, о которых мы поговорим далее), Ударить (тип оружия или магии), Искусственный интеллект, Проверить столкновение с объектом (об этом мы также поговорим далее).

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

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

TMovable=class

procedure CheckCollision(obj: TMovable); virtual; end;


⇐ Предыдущая страница| |Следующая страница ⇒