Game Programming Patterns / Паттерны программирования в играх: 3.3 Type Object

← →
Английский оригинал Перевод на русский

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

Цель

asbestovek 30.04.14 в 18:54

0

Мотивация

kabanov 24.06.14 в 13:10

0

Представьте себе, что мы работаем над ролевой фэнтези игрой.

asbestovek 30.04.14 в 18:56

0

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

asbestovek 30.04.14 в 18:59

0

У монстров есть много разных характеристик: здоровье, атака, графика, звуки и т.д,

asbestovek 30.04.14 в 19:00

0

но для примера нам будут нужны только первых две.

asbestovek 30.04.14 в 19:03

0

У каждого монстра есть значение текущего здоровья.

asbestovek 30.04.14 в 19:04

0

Вначале оно полное, но каждый раз когда при получении урона уменьшается.

asbestovek 30.04.14 в 19:06

0

Также монстры обадают строкой атаки.

asbestovek 30.04.14 в 19:07

0

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

asbestovek 30.04.14 в 19:08

0

( Пока нам все равно как)

asbestovek 30.04.14 в 19:09

0

Дизайнеры сказали нам, что существуют различные породы монстров,такие как дракон или тролль.

asbestovek 30.04.14 в 19:11

0

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

asbestovek 30.04.14 в 19:15

0

Порода устанавливает стартовое количество здоровья.У дракона его больше чем у тролля, что делает его более живучим.

asbestovek 30.04.14 в 19:21

0

Также она определяет строку атаки: все монстры с одинаковой породой атакуют одним и тем же способом.

asbestovek 30.04.14 в 19:24

0

Типичная ООП ответ

asbestovek 30.04.14 в 19:30

0

Учитывая игровой дизайн, откроем текстовый редактор и начнем программировать.

asbestovek 30.04.14 в 19:31

0

В соответствии с проектом, дракон это один тип монстра, тролль другой, и так далее с другими породами.

asbestovek 30.04.14 в 19:33

0

Мысля объектно-ориентировано, приходим к выводу, что нам нужен класс Monster:

asbestovek 30.04.14 в 19:35

0

Это так называемое “is-a” отношение.

asbestovek 30.04.14 в 19:35

0

Согласно ООП, так как дракон является монстром, то модель Dragon должна быть подклассом класса Monster.

asbestovek 30.04.14 в 19:41

0

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

asbestovek 30.04.14 в 19:44

0

class Monster

asbestovek 30.04.14 в 19:44

0

{

asbestovek 30.04.14 в 19:44

0

public:

asbestovek 30.04.14 в 19:44

0

virtual ~Monster() {}

asbestovek 30.04.14 в 19:44

0

virtual const char* getAttack() = 0;

asbestovek 30.04.14 в 19:44

0

protected:

asbestovek 30.04.14 в 19:44

0

Monster(int startingHealth)

asbestovek 30.04.14 в 19:44

0

: health_(startingHealth)

asbestovek 30.04.14 в 19:44

0

{}

asbestovek 30.04.14 в 19:45

0

private:

asbestovek 30.04.14 в 19:45

0

int health_; // Current health.

asbestovek 30.04.14 в 19:45

0

};

asbestovek 30.04.14 в 19:45

0

Публичный метод getAttack() определяет строку, которая будет отображаться при атаке монстром нашего героя.

asbestovek 01.05.14 в 07:54

0

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

asbestovek 30.04.14 в 19:51

0

Конструктор объявлен как protected и принимает в качестве аргумента начальное здоровья монстра.

asbestovek 01.05.14 в 07:45

0

Мы объявим классы для каждой породы, которые будут обеспечивать свои собственные открытые конструкторы, в которые будет передаваться стартовое количество здоровья для каждой отдельной породы монстров..

asbestovek 01.05.14 в 07:50

0

Теперь взглянем на пару подобных подклассов.

asbestovek 01.05.14 в 07:51

0

class Dragon : public Monster

asbestovek 30.04.14 в 19:45

0

{

asbestovek 30.04.14 в 19:45

0

public:

asbestovek 30.04.14 в 19:45

0

Dragon() : Monster(230) {}

asbestovek 30.04.14 в 19:45

0

const char* getAttack() {

asbestovek 30.04.14 в 19:45

0

return "The dragon breathes fire!"

asbestovek 30.04.14 в 19:45

0

;

asbestovek 30.04.14 в 19:45

0

}

asbestovek 30.04.14 в 19:46

0

};

asbestovek 30.04.14 в 19:46

0

class Troll : public Monster

asbestovek 30.04.14 в 19:46

0
Минутку...

Следующая страница →