Game Programming Patterns / Паттерны программирования в играх: 3.3 Type Object
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Цель asbestovek 30.04.14 в 18:54 |
|
|
Мотивация kabanov 24.06.14 в 13:10 |
||
|
Представьте себе, что мы работаем над ролевой фэнтези игрой. asbestovek 30.04.14 в 18:56 |
||
|
Наша задача написать код для орды злобных монстров, пытающихся убить нашего отважного героя asbestovek 30.04.14 в 18:59 |
||
|
У монстров есть много разных характеристик: здоровье, атака, графика, звуки и т.д, asbestovek 30.04.14 в 19:00 |
||
|
но для примера нам будут нужны только первых две. asbestovek 30.04.14 в 19:03 |
||
|
У каждого монстра есть значение текущего здоровья. asbestovek 30.04.14 в 19:04 |
||
|
Вначале оно полное, но каждый раз когда при получении урона уменьшается. asbestovek 30.04.14 в 19:06 |
||
|
Также монстры обадают строкой атаки. asbestovek 30.04.14 в 19:07 |
||
|
При каждой атаке монстрами нашего героя, она каким-то образом будет показывается пользователю. asbestovek 30.04.14 в 19:08 |
||
|
( Пока нам все равно как) asbestovek 30.04.14 в 19:09 |
||
|
Дизайнеры сказали нам, что существуют различные породы монстров,такие как дракон или тролль. asbestovek 30.04.14 в 19:11 |
||
|
Каждая порода описывает вид монстра существующего в игре.Может быть несколько монстров одной и той же породы бегающих в подземелье в одно и тоже время. asbestovek 30.04.14 в 19:15 |
||
|
Порода устанавливает стартовое количество здоровья.У дракона его больше чем у тролля, что делает его более живучим. asbestovek 30.04.14 в 19:21 |
||
|
Также она определяет строку атаки: все монстры с одинаковой породой атакуют одним и тем же способом. asbestovek 30.04.14 в 19:24 |
||
|
Типичная ООП ответ asbestovek 30.04.14 в 19:30 |
||
|
Учитывая игровой дизайн, откроем текстовый редактор и начнем программировать. asbestovek 30.04.14 в 19:31 |
||
|
В соответствии с проектом, дракон это один тип монстра, тролль другой, и так далее с другими породами. asbestovek 30.04.14 в 19:33 |
||
|
Мысля объектно-ориентировано, приходим к выводу, что нам нужен класс Monster: asbestovek 30.04.14 в 19:35 |
||
|
Это так называемое “is-a” отношение. asbestovek 30.04.14 в 19:35 |
||
|
Согласно ООП, так как дракон является монстром, то модель Dragon должна быть подклассом класса Monster. asbestovek 30.04.14 в 19:41 |
||
|
В последствии мы убедимся, что наследование единственный путь к сохранению концептуальных связей как в этом коде: asbestovek 30.04.14 в 19:44 |
||
|
class Monster asbestovek 30.04.14 в 19:44 |
||
|
{ asbestovek 30.04.14 в 19:44 |
||
|
public: asbestovek 30.04.14 в 19:44 |
||
|
virtual ~Monster() {} asbestovek 30.04.14 в 19:44 |
||
|
virtual const char* getAttack() = 0; asbestovek 30.04.14 в 19:44 |
||
|
protected: asbestovek 30.04.14 в 19:44 |
||
|
Monster(int startingHealth) asbestovek 30.04.14 в 19:44 |
||
|
: health_(startingHealth) asbestovek 30.04.14 в 19:44 |
||
|
{} asbestovek 30.04.14 в 19:45 |
||
|
private: asbestovek 30.04.14 в 19:45 |
||
|
int health_; // Current health. asbestovek 30.04.14 в 19:45 |
||
|
}; asbestovek 30.04.14 в 19:45 |
||
|
Публичный метод getAttack() определяет строку, которая будет отображаться при атаке монстром нашего героя. asbestovek 01.05.14 в 07:54 |
||
|
Каждый унаследованный класс будет переопределять этот метод, чтобы обеспечить разные уведомления при атаке. asbestovek 30.04.14 в 19:51 |
||
|
Конструктор объявлен как protected и принимает в качестве аргумента начальное здоровья монстра. asbestovek 01.05.14 в 07:45 |
||
|
Мы объявим классы для каждой породы, которые будут обеспечивать свои собственные открытые конструкторы, в которые будет передаваться стартовое количество здоровья для каждой отдельной породы монстров.. asbestovek 01.05.14 в 07:50 |
||
|
Теперь взглянем на пару подобных подклассов. asbestovek 01.05.14 в 07:51 |
||
|
class Dragon : public Monster asbestovek 30.04.14 в 19:45 |
||
|
{ asbestovek 30.04.14 в 19:45 |
||
|
public: asbestovek 30.04.14 в 19:45 |
||
|
Dragon() : Monster(230) {} asbestovek 30.04.14 в 19:45 |
||
|
const char* getAttack() { asbestovek 30.04.14 в 19:45 |
||
|
return "The dragon breathes fire!" asbestovek 30.04.14 в 19:45 |
||
|
; asbestovek 30.04.14 в 19:45 |
||
|
} asbestovek 30.04.14 в 19:46 |
||
|
}; asbestovek 30.04.14 в 19:46 |
||
|
class Troll : public Monster asbestovek 30.04.14 в 19:46 |
