Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype

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

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

Одна важная деталь - этот паттерн копирует не только класс прототипа, он копирует и его состояние.

RSlafka 30.05.14 в 06:57

1

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

RSlafka 30.05.14 в 07:01

0

Я нахожу этот паттерн одновременно изящным и удивительным.

RSlafka 30.05.14 в 10:07

1

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

RSlafka 30.05.14 в 10:09

1

Насколько хорошо он работает?

RSlafka 30.05.14 в 07:17

1

Нам не нужно создавать отдельный генератор для каждого монстра - это здорово.

RSlafka 30.05.14 в 07:19

1

Но мы должны реализовать метод clone() в каждом классе, описывающем конкретного монстра.

RSlafka 30.05.14 в 07:20

1

А ведь это примерно столько же кода, как и в случае с отдельными генераторами.

RSlafka 30.05.14 в 07:23

1

Грамотная реализация clone() не обойдется без "темных углов", обусловленных семантикой языка. Будет выполняться глубокое клонирование или же поверхностное?

RSlafka 30.05.14 в 07:44

1

Скажем, когда у вас одно из полей класса - ссылка на объект, нужно ли копировать объект или достаточно скопировать ссылку на него?

RSlafka 30.05.14 в 07:48

1

Как этот объект взаимодейтсвует со своими данными?

RSlafka 30.05.14 в 10:38

1

Вообщем, не только не похоже, что этот подход сильно сэкономит нам количество кода в этой надуманной проблеме, но и то, что эта проблема надуманна - факт.

RSlafka 30.05.14 в 10:46

0

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

RSlafka 30.05.14 в 10:49

0

Впрочем, в наши дни - это не тот путь, по которому идет большинство игровых движков.

RSlafka 30.05.14 в 10:56

0

Большинство из нас научены горьким опытом, что управление большой иерархией классов - это головная боль, и именно поэтому используются паттерны Component и Type Object для моделирования различного рода объектов без создания для них собственных классов.

RSlafka 30.05.14 в 11:05

0

Spawn-функции

RSlafka 30.05.14 в 10:22

0

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

fregate 14.10.14 в 10:04

0
+1

Вместо того, чтобы создавать отдельные spawn-классы для каждого монстра, мы можем реализовать spawn-функции. Например:

RSlafka 30.05.14 в 11:23

0

Monster* spawnGhost()

RSlafka 30.05.14 в 11:23

0

{

RSlafka 30.05.14 в 11:23

0

return new Ghost();

RSlafka 30.05.14 в 11:23

0

}

RSlafka 30.05.14 в 11:23

0

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

RSlafka 30.05.14 в 11:31

0

Теперь один-единственный spawner-класс может просто хранить указатель на spawn-функцию:

RSlafka 30.05.14 в 11:34

0

typedef Monster* (*SpawnCallback)();

RSlafka 30.05.14 в 11:35

0

();

GromHoll 17.06.14 в 11:47

0

class Spawner

RSlafka 30.05.14 в 11:35

0

{

RSlafka 30.05.14 в 11:35

0

public:

RSlafka 30.05.14 в 11:35

0

Spawner(SpawnCallback spawn)

RSlafka 30.05.14 в 11:37

0

: spawn_(spawn)

RSlafka 30.05.14 в 11:37

0

{}

RSlafka 30.05.14 в 11:37

0

Monster* spawnMonster()

RSlafka 30.05.14 в 11:37

0

{

RSlafka 30.05.14 в 11:38

0

return spawn_();

RSlafka 30.05.14 в 11:38

0

}

RSlafka 30.05.14 в 11:38

0

private:

RSlafka 30.05.14 в 11:38

0

SpawnCallback spawn_;

RSlafka 30.05.14 в 11:38

0

};

RSlafka 30.05.14 в 11:38

0

Создание spawner для призрака выглядит так:

RSlafka 30.05.14 в 11:40

0

Spawner* ghostSpawner = new Spawner(spawnGhost);

RSlafka 30.05.14 в 11:40

0

;

GromHoll 14.06.14 в 11:41

0

Шаблоны

RSlafka 30.05.14 в 11:41

0

Большинство C++ разработчиков знакомы с шаблонами.

RSlafka 30.05.14 в 12:14

0

Нашему spawner-классу необходимо создавать инстанс определенного типа, но мы не хотим вписывать в него какой-то конкретный класс монстра.

RSlafka 30.05.14 в 12:41

0

Естественным решением будет передача типа в качестве параметра, что позволяют сделать шаблоны.

RSlafka 30.05.14 в 12:44

0

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

RSlafka 30.05.14 в 12:29

0

class Spawner

RSlafka 30.05.14 в 12:45

0

{

RSlafka 30.05.14 в 12:45

0

public:

RSlafka 30.05.14 в 12:45

0
Минутку...

← Предыдущая страница

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