Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Одна важная деталь - этот паттерн копирует не только класс прототипа, он копирует и его состояние. RSlafka 30.05.14 в 06:57 |
|
|
Это означает, что мы можем создать генератор быстрых, медленных или слабых призраков, просто создав соответствующий прототип призрака. RSlafka 30.05.14 в 07:01 |
||
|
Я нахожу этот паттерн одновременно изящным и удивительным. RSlafka 30.05.14 в 10:07 |
||
|
Я не представляю, что дошел бы до него сам, но и не могу представить, как смог бы работать без него. RSlafka 30.05.14 в 10:09 |
||
|
Насколько хорошо он работает? RSlafka 30.05.14 в 07:17 |
||
|
Нам не нужно создавать отдельный генератор для каждого монстра - это здорово. RSlafka 30.05.14 в 07:19 |
||
|
Но мы должны реализовать метод clone() в каждом классе, описывающем конкретного монстра. RSlafka 30.05.14 в 07:20 |
||
|
А ведь это примерно столько же кода, как и в случае с отдельными генераторами. RSlafka 30.05.14 в 07:23 |
||
|
Грамотная реализация clone() не обойдется без "темных углов", обусловленных семантикой языка. Будет выполняться глубокое клонирование или же поверхностное? RSlafka 30.05.14 в 07:44 |
||
|
Скажем, когда у вас одно из полей класса - ссылка на объект, нужно ли копировать объект или достаточно скопировать ссылку на него? RSlafka 30.05.14 в 07:48 |
||
|
Как этот объект взаимодейтсвует со своими данными? RSlafka 30.05.14 в 10:38 |
||
|
Вообщем, не только не похоже, что этот подход сильно сэкономит нам количество кода в этой надуманной проблеме, но и то, что эта проблема надуманна - факт. RSlafka 30.05.14 в 10:46 |
||
|
Мы должны принять как данность, что для каждого монстра имеется отдельный класс. RSlafka 30.05.14 в 10:49 |
||
|
Впрочем, в наши дни - это не тот путь, по которому идет большинство игровых движков. RSlafka 30.05.14 в 10:56 |
||
|
Большинство из нас научены горьким опытом, что управление большой иерархией классов - это головная боль, и именно поэтому используются паттерны Component и Type Object для моделирования различного рода объектов без создания для них собственных классов. RSlafka 30.05.14 в 11:05 |
||
|
Spawn-функции RSlafka 30.05.14 в 10:22 |
||
|
Даже в случае отдельных классов для каждого монстра, существуют другие пути создавать таке объекты. fregate 14.10.14 в 10:04 |
+1 | |
|
Вместо того, чтобы создавать отдельные spawn-классы для каждого монстра, мы можем реализовать spawn-функции. Например: RSlafka 30.05.14 в 11:23 |
||
|
Monster* spawnGhost() RSlafka 30.05.14 в 11:23 |
||
|
{ RSlafka 30.05.14 в 11:23 |
||
|
return new Ghost(); RSlafka 30.05.14 в 11:23 |
||
|
} RSlafka 30.05.14 в 11:23 |
||
|
Этот подход используется реже, чем выкатывание класса для создания монстра определенного типа. RSlafka 30.05.14 в 11:31 |
||
|
Теперь один-единственный spawner-класс может просто хранить указатель на spawn-функцию: RSlafka 30.05.14 в 11:34 |
||
|
typedef Monster* (*SpawnCallback)(); RSlafka 30.05.14 в 11:35 |
||
|
(); GromHoll 17.06.14 в 11:47 |
||
|
class Spawner RSlafka 30.05.14 в 11:35 |
||
|
{ RSlafka 30.05.14 в 11:35 |
||
|
public: RSlafka 30.05.14 в 11:35 |
||
|
Spawner(SpawnCallback spawn) RSlafka 30.05.14 в 11:37 |
||
|
: spawn_(spawn) RSlafka 30.05.14 в 11:37 |
||
|
{} RSlafka 30.05.14 в 11:37 |
||
|
Monster* spawnMonster() RSlafka 30.05.14 в 11:37 |
||
|
{ RSlafka 30.05.14 в 11:38 |
||
|
return spawn_(); RSlafka 30.05.14 в 11:38 |
||
|
} RSlafka 30.05.14 в 11:38 |
||
|
private: RSlafka 30.05.14 в 11:38 |
||
|
SpawnCallback spawn_; RSlafka 30.05.14 в 11:38 |
||
|
}; RSlafka 30.05.14 в 11:38 |
||
|
Создание spawner для призрака выглядит так: RSlafka 30.05.14 в 11:40 |
||
|
Spawner* ghostSpawner = new Spawner(spawnGhost); RSlafka 30.05.14 в 11:40 |
||
|
; GromHoll 14.06.14 в 11:41 |
||
|
Шаблоны RSlafka 30.05.14 в 11:41 |
||
|
Большинство C++ разработчиков знакомы с шаблонами. RSlafka 30.05.14 в 12:14 |
||
|
Нашему spawner-классу необходимо создавать инстанс определенного типа, но мы не хотим вписывать в него какой-то конкретный класс монстра. RSlafka 30.05.14 в 12:41 |
||
|
Естественным решением будет передача типа в качестве параметра, что позволяют сделать шаблоны. RSlafka 30.05.14 в 12:44 |
||
|
Я не уверен, пришлись ли они по душе C++ разработчикам, или наоборот, оттолкнули их от языка. В любом случае, все те, кого я вижу, используют шаблоны в C++. RSlafka 30.05.14 в 12:29 |
||
|
class Spawner RSlafka 30.05.14 в 12:45 |
||
|
{ RSlafka 30.05.14 в 12:45 |
||
|
public: RSlafka 30.05.14 в 12:45 |
