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

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

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

"maxHealth": 30,

GromHoll 11.10.14 в 19:16

0

"resists": ["cold", "poison"],

GromHoll 11.10.14 в 19:16

0

"weaknesses": ["fire", "light"],

GromHoll 11.10.14 в 19:16

0

"attacks": ["short bow"]

GromHoll 11.10.14 в 19:16

0

}

GromHoll 11.10.14 в 19:16

0

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

GromHoll 11.10.14 в 19:18

0

Огромное количество дублирования между этими сущностями, которое так ненавидят квалифицированные программисты.

GromHoll 11.10.14 в 19:20

0

Это занимает лишнее пространство и тратит время автора.

GromHoll 11.10.14 в 19:20

0

Вы должны внимательно прочитать всё, даже если данные одинаковые.

GromHoll 11.10.14 в 19:21

0

Это гарантирует головную боль.

GromHoll 11.10.14 в 19:21

0

Если мы захотим сделать гоблинов в игре сильнее, нужно не забыть обновить здоровье всех трёх.

GromHoll 11.10.14 в 19:22

0

Плохо. Очень плохо.

GromHoll 11.10.14 в 19:22

0

Будь это кодом, мы бы создали абстракцию "гоблин" и использовали бы её во всех трёх видах гоблинов.

GromHoll 11.10.14 в 19:24

0

Но глупый JSON ничего не знает об этом.

GromHoll 11.10.14 в 19:24

0

Так что давайте сделаем его немного умнее.

GromHoll 11.10.14 в 19:24

0

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

GromHoll 11.10.14 в 19:27

0

Все свойства, которые не существуют в первом объекте, будут искаться в прототипе.

GromHoll 11.10.14 в 19:28

0

Это делает "prototype" набором методанных.

GromHoll 11.10.14 в 19:29

0

У гоблинов бородавчатая зеленая кожа и желтые зубы.

GromHoll 11.10.14 в 19:30

0

Они не имеют прототипов.

GromHoll 11.10.14 в 19:30

0

Прототипы это свойство объекта данных представляющего конкретного гоблина, а не гоблина самого по себе.

GromHoll 11.10.14 в 19:31

0

С этим мы можем упростить JSON для нашей орды гоблинов:

GromHoll 11.10.14 в 19:32

0

{

GromHoll 11.10.14 в 19:32

0

"name": "goblin grunt",

GromHoll 11.10.14 в 19:32

0

"minHealth": 20,

GromHoll 11.10.14 в 19:32

0

"maxHealth": 30,

GromHoll 11.10.14 в 19:32

0

"resists": ["cold", "poison"],

GromHoll 11.10.14 в 19:32

0

"weaknesses": ["fire", "light"]

GromHoll 11.10.14 в 19:32

0

}

GromHoll 11.10.14 в 19:32

0

{

GromHoll 11.10.14 в 19:32

0

"name": "goblin wizard",

GromHoll 11.10.14 в 19:32

0

"prototype": "goblin grunt",

GromHoll 11.10.14 в 19:33

0

"spells": ["fire ball", "lightning bolt"]

GromHoll 11.10.14 в 19:33

0

}

GromHoll 11.10.14 в 19:33

0

{

GromHoll 11.10.14 в 19:33

0

"name": "goblin archer",

GromHoll 11.10.14 в 19:33

0

"prototype": "goblin grunt",

GromHoll 11.10.14 в 19:33

0

"attacks": ["short bow"]

GromHoll 11.10.14 в 19:33

0

}

GromHoll 11.10.14 в 19:33

0

Теперь, когда archer и wizard имеют в качестве прототипа grunt, нам не требуется повторять здоровье, сопротивления и слабости для каждого из них.

GromHoll 11.10.14 в 19:35

0

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

GromHoll 11.10.14 в 19:37

0

Одна интересная вещь - мы не стали создавать четвертую сущность "base goblin" как абстрактный прототип для остальных трёх типов гоблинов.

GromHoll 11.10.14 в 19:38

0

Вместо этого мы просто взяли самого простого гоблина и делегировали его.

GromHoll 11.10.14 в 19:39

0

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

GromHoll 11.10.14 в 19:40

0

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

GromHoll 11.10.14 в 19:41

0

Такие как боссы или уникальные предметы.

GromHoll 11.10.14 в 19:42

0

Они более подробно описаны, чем большинство обычных объектов в игре и делегирование прототипов это отличный способ для их определения.

GromHoll 11.10.14 в 19:43

0

Волшебный Меч Отделения Голов, который на самом деле просто длинный меч с некоторыми бонусами, описывается так:

GromHoll 11.10.14 в 19:45

0

{

GromHoll 11.10.14 в 19:45

0

"name": "Sword of Head-Detaching",

GromHoll 11.10.14 в 19:45

0
Минутку...

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

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