Game Programming Patterns / Паттерны программирования в играх: 1.4. Prototype
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
"maxHealth": 30, GromHoll 11.10.14 в 19:16 |
|
|
"resists": ["cold", "poison"], GromHoll 11.10.14 в 19:16 |
||
|
"weaknesses": ["fire", "light"], GromHoll 11.10.14 в 19:16 |
||
|
"attacks": ["short bow"] GromHoll 11.10.14 в 19:16 |
||
|
} GromHoll 11.10.14 в 19:16 |
||
|
В этот момент, если это было кодом, внутреннее чувство прекрасного дало бы о себя знать. GromHoll 11.10.14 в 19:18 |
||
|
Огромное количество дублирования между этими сущностями, которое так ненавидят квалифицированные программисты. GromHoll 11.10.14 в 19:20 |
||
|
Это занимает лишнее пространство и тратит время автора. GromHoll 11.10.14 в 19:20 |
||
|
Вы должны внимательно прочитать всё, даже если данные одинаковые. GromHoll 11.10.14 в 19:21 |
||
|
Это гарантирует головную боль. GromHoll 11.10.14 в 19:21 |
||
|
Если мы захотим сделать гоблинов в игре сильнее, нужно не забыть обновить здоровье всех трёх. GromHoll 11.10.14 в 19:22 |
||
|
Плохо. Очень плохо. GromHoll 11.10.14 в 19:22 |
||
|
Будь это кодом, мы бы создали абстракцию "гоблин" и использовали бы её во всех трёх видах гоблинов. GromHoll 11.10.14 в 19:24 |
||
|
Но глупый JSON ничего не знает об этом. GromHoll 11.10.14 в 19:24 |
||
|
Так что давайте сделаем его немного умнее. GromHoll 11.10.14 в 19:24 |
||
|
Мы договариваемся, что если объект имеет поле "prototype", то оно определяет имя другого объекта, который выступает делегатом. GromHoll 11.10.14 в 19:27 |
||
|
Все свойства, которые не существуют в первом объекте, будут искаться в прототипе. GromHoll 11.10.14 в 19:28 |
||
|
Это делает "prototype" набором методанных. GromHoll 11.10.14 в 19:29 |
||
|
У гоблинов бородавчатая зеленая кожа и желтые зубы. GromHoll 11.10.14 в 19:30 |
||
|
Они не имеют прототипов. GromHoll 11.10.14 в 19:30 |
||
|
Прототипы это свойство объекта данных представляющего конкретного гоблина, а не гоблина самого по себе. GromHoll 11.10.14 в 19:31 |
||
|
С этим мы можем упростить JSON для нашей орды гоблинов: GromHoll 11.10.14 в 19:32 |
||
|
{ GromHoll 11.10.14 в 19:32 |
||
|
"name": "goblin grunt", GromHoll 11.10.14 в 19:32 |
||
|
"minHealth": 20, GromHoll 11.10.14 в 19:32 |
||
|
"maxHealth": 30, GromHoll 11.10.14 в 19:32 |
||
|
"resists": ["cold", "poison"], GromHoll 11.10.14 в 19:32 |
||
|
"weaknesses": ["fire", "light"] GromHoll 11.10.14 в 19:32 |
||
|
} GromHoll 11.10.14 в 19:32 |
||
|
{ GromHoll 11.10.14 в 19:32 |
||
|
"name": "goblin wizard", GromHoll 11.10.14 в 19:32 |
||
|
"prototype": "goblin grunt", GromHoll 11.10.14 в 19:33 |
||
|
"spells": ["fire ball", "lightning bolt"] GromHoll 11.10.14 в 19:33 |
||
|
} GromHoll 11.10.14 в 19:33 |
||
|
{ GromHoll 11.10.14 в 19:33 |
||
|
"name": "goblin archer", GromHoll 11.10.14 в 19:33 |
||
|
"prototype": "goblin grunt", GromHoll 11.10.14 в 19:33 |
||
|
"attacks": ["short bow"] GromHoll 11.10.14 в 19:33 |
||
|
} GromHoll 11.10.14 в 19:33 |
||
|
Теперь, когда archer и wizard имеют в качестве прототипа grunt, нам не требуется повторять здоровье, сопротивления и слабости для каждого из них. GromHoll 11.10.14 в 19:35 |
||
|
Логика, которую мы добавили в нашу модель данных очень проста - обычное одиночное делегирование - но мы избавились от кучи дублирования. GromHoll 11.10.14 в 19:37 |
||
|
Одна интересная вещь - мы не стали создавать четвертую сущность "base goblin" как абстрактный прототип для остальных трёх типов гоблинов. GromHoll 11.10.14 в 19:38 |
||
|
Вместо этого мы просто взяли самого простого гоблина и делегировали его. GromHoll 11.10.14 в 19:39 |
||
|
Это вполне естественно в любой системе, базирующейся на прототипах, где любой объект может быть клонирован для создания новых необычных объектов, так что я думаю это естественно и тут. GromHoll 11.10.14 в 19:40 |
||
|
Это отлично подходит для данных в играх, где имеется много одноразовых особых сущностей в игровом мире. GromHoll 11.10.14 в 19:41 |
||
|
Такие как боссы или уникальные предметы. GromHoll 11.10.14 в 19:42 |
||
|
Они более подробно описаны, чем большинство обычных объектов в игре и делегирование прототипов это отличный способ для их определения. GromHoll 11.10.14 в 19:43 |
||
|
Волшебный Меч Отделения Голов, который на самом деле просто длинный меч с некоторыми бонусами, описывается так: GromHoll 11.10.14 в 19:45 |
||
|
{ GromHoll 11.10.14 в 19:45 |
||
|
"name": "Sword of Head-Detaching", GromHoll 11.10.14 в 19:45 |
