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

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

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

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

Mingun 30.04.14 в 14:49

1

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

IngaJolly 03.05.14 в 17:58

1

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

Mingun 30.04.14 в 14:50

0

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

Deo 21.08.14 в 21:35

0

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

IngaJolly 23.08.14 в 17:01

0

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

Mingun 30.04.14 в 14:52

1

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

IngaJolly 23.08.14 в 17:02

0

Для такого разбухшего шаблона «Банда четырёх» даёт предсказуемо заумное описание:

Mingun 30.04.14 в 14:53

0

Для такого раздутого паттерна у "Банды четырех" есть предсказуемо малопонятное описание:

IngaJolly 03.05.14 в 18:53

1

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

Mingun 30.04.14 в 15:05

1

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

IngaJolly 03.05.14 в 18:56

0

Можем ли мы согласиться, что это страшная фраза?

Mingun 30.04.14 в 14:58

0

Мощное предложение, не правда ли?

IngaJolly 03.05.14 в 18:57

0

Согласитесь, страшноватая фраза.

Deo 21.08.14 в 21:43

0

Прежде всего она искажает всё, что пытается донести до нас эта метафора.

Mingun 30.04.14 в 15:00

0

Прежде всего, оно искажает все, что пытается заключить эта метафора.

IngaJolly 03.05.14 в 18:58

0

Во-первых, она искажает смысл того, что пытается до нас донести.

Deo 21.08.14 в 21:49

0

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

Mingun 30.04.14 в 15:01

2

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

Mingun 30.04.14 в 15:02

0

Вплоть до настоящего времени людей нельзя было "параметризовать".

IngaJolly 03.05.14 в 18:59

0

Я проверял, людей нельзя "параметризовывать".

Deo 21.08.14 в 21:47

0

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

Mingun 30.04.14 в 15:07

0

Оставшаяся часть предложения - это просто список вещей, к которым вы, вероятно, сможете применить данный паттерн.

IngaJolly 03.05.14 в 19:01

0

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

Deo 21.08.14 в 21:52

0

Не очень проясняет ситуацию, если ваш случай использования не находится в данном списке.

Mingun 30.04.14 в 15:09

0

Не очень-то ясно, если вашего сценария использования нет в этом списке.

IngaJolly 03.05.14 в 19:02

0

Не очень-то проясняет, если ваш сценарий выходит за пределы этого списка.

Deo 21.08.14 в 21:53

0

Мой содержательный слоган для шаблона Команда будет таким:

Mingun 30.04.14 в 15:11

0

Мой сжатый слоган для паттерна "команда" будет звучать так:

IngaJolly 03.05.14 в 19:03

0

Вот мое содержательное определение для паттерна Command:

Deo 21.08.14 в 21:55

0

Команда — это материализованный вызов метода.

Mingun 30.04.14 в 15:11

1

«Материализация» («Reify») происходит от латинского «res» — «вещь», с добавлением английского суффикса «–fy». Так что это слово практически означает «овеществление» («thingify»), которое, честно говоря, было бы более подходящим словом.

Mingun 30.04.14 в 15:18

0

"Материализовать" ("reify") происходит от латинского "res" — "вещь", с добавлением английского суффикса "–fy". Так что это слово буквально значит "овеществлять" ("thingify"), и этот синоним, честно говоря, больше подходит в качестве определения.

IngaJolly 03.05.14 в 19:19

0

"Материализовывать" ("reify") происходит от латинского "res" — "вещь", с добавлением английского суффикса "–fy". То есть, это буквально означает "овеществлять", а этот синоним, честно говоря, гораздо забавнее.

Deo 21.08.14 в 22:01

0

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

Mingun 30.04.14 в 15:20

0

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

IngaJolly 03.05.14 в 19:21

0

Естественно, "содержательное" часто значит "предельно краткое", так что это, возможно, не значительное улучшение.

Deo 21.08.14 в 22:04

0

Позвольте мне немного разъяснить, что я имею ввиду.

Mingun 30.04.14 в 15:20

0

Позвольте мне дать немного более развернутое описание.

IngaJolly 03.05.14 в 19:22

1

«Материализация», в случае, если вы никогда не слышали этого слова, означает «делание реальным».

Mingun 30.04.14 в 15:23

0

"Материализовать" (если вы никогда не слышали этого слова) означает "сделать реальным".

IngaJolly 03.05.14 в 19:22

2

Другое определение материализации — делание чего-либо объектом «первого класса». Оба означают взятие какой-то концепции и превращение её в кусок данных — объект — так что вы сможете сохранить его в переменной, передать в функцию и т.д.

Mingun 30.04.14 в 15:26

0

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

IngaJolly 04.05.14 в 13:02

0

Другое определение материализации - это сделать нечто "первоклассным". Оба определения подразумевают взятие некого концепта и превращения его в данные - объект, который вы можете "засунуть" в переменную, передать в функцию и т.д.

Deo 21.08.14 в 22:11

0

Таким образом, говоря, что шаблон Команда — это «материализованный вызов метода», я имею ввиду, что это вызов метода, завернутого в объект.

Mingun 30.04.14 в 15:27

0

Таким образом, называя паттерн "команду" "вызовом материализованного метода", я имею в виду, что это вызов метода, обернутый в объект.

IngaJolly 04.05.14 в 13:04

1

Всё это звучит очень похоже на «функцию обратного вызова», «функцию, как объект первого класса», «указатель на функцию», «замыкание» или «частично применяемую функцию» в зависимости от языка, из которого вы пришли, и действительно, все эти вещи означают примерно одно и тоже.

Mingun 30.04.14 в 15:34

0

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

IngaJolly 04.05.14 в 13:16

1

Далее «Банда четырёх» пишет:

Mingun 30.04.14 в 15:34

1

Команды представляют собой объектно-ориентированную альтернативу функциям обратного вызова.

Mingun 30.04.14 в 15:41

2

Команды - это объектно-ориентированная замена функций обратного вызова.

IngaJolly 04.05.14 в 13:17

0
+2

Это был бы намного лучший слоган для шаблона, нежели тот, который они выбрали.

Mingun 30.04.14 в 15:44

0

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

IngaJolly 04.05.14 в 14:17

1

Но всё это несколько абстрактно и туманно.

Mingun 30.04.14 в 15:45

1

Но все это абстрактно и туманно.

IngaJolly 04.05.14 в 13:25

0

Я бы хотел начинать главы с чего-то конкретного и я сделал это.

Mingun 30.04.14 в 15:51

0

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

IngaJolly 04.05.14 в 13:31

1

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

Deo 21.08.14 в 22:22

0

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

IngaJolly 04.05.14 в 13:33

0

Система отражений в некоторых языках позволяет вам работать с типами вашей программы непосредственно во время её выполнения.

Mingun 30.04.14 в 15:57

0

Системы рефлексии в некоторых языках программирования позволяют вам работать с типами в программе императивно во время выполнения.

IngaJolly 04.05.14 в 14:07

1

Рефлексия в некоторых языках позволяет работать с типами императивно во время выполнения.

Deo 21.08.14 в 22:26

0

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

Mingun 30.04.14 в 15:59

0

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

Deo 21.08.14 в 22:29

0

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

IngaJolly 23.08.14 в 17:12

0

Другими словами, отражения — это материализованная система типов.

Mingun 30.04.14 в 15:59

0

Другими словами, рефлексия - это материализованная система типов.

IngaJolly 04.05.14 в 14:12

2

Настройка ввода

Mingun 30.04.14 в 15:56

0

Настраиваем ввод.

Deo 21.08.14 в 22:29

0

Настраиваем кнопки ввода

IngaJolly 23.08.14 в 17:13

0

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

Mingun 30.04.14 в 16:02

0

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

IngaJolly 04.05.14 в 15:28

0

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

Deo 21.08.14 в 22:33

0

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

Mingun 30.04.14 в 16:04

0

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

IngaJolly 04.05.14 в 15:31

0

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

Deo 21.08.14 в 22:35

0

Тупейшая простая реализация выглядит как-то так:

Mingun 30.04.14 в 16:04

0

Наипростейшая реализация выглядит примерно так:

Deo 21.08.14 в 22:36

0

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

IngaJolly 23.08.14 в 17:15

0

void InputHandler::handleInput()

Mingun 30.04.14 в 15:54

1

{

Mingun 30.04.14 в 15:54

1

if (isPressed(BUTTON_X))

Mingun 30.04.14 в 15:54

1

jump();

Mingun 30.04.14 в 15:54

1

else if (isPressed(BUTTON_Y))

Mingun 30.04.14 в 15:54

1

fireGun();

Mingun 30.04.14 в 15:54

1

else if (isPressed(BUTTON_A))

Mingun 30.04.14 в 15:54

1

swapWeapon();

Mingun 30.04.14 в 15:54

1

else if (isPressed(BUTTON_B))

Mingun 30.04.14 в 15:54

1

lurchIneffectively();

Mingun 30.04.14 в 15:55

1

}

Mingun 30.04.14 в 15:55

1

Совет: не нажимайте B слишком часто.

Mingun 30.04.14 в 15:55

1

Совет новичку: не нажимайте B слишком часто.

IngaJolly 04.05.14 в 15:33

0

Эта функция обычно вызывается один раз за кадр в игровом цикле.

Mingun 30.04.14 в 16:05

0

Эта функция обычно вызывается раз в кадр паттерном Game Loop ("игровой цикл").

IngaJolly 04.05.14 в 15:36

1

Вы можете понять, что она делает.

Mingun 30.04.14 в 16:06

1

Можно понять, что она делает.

IngaJolly 23.08.14 в 17:17

0

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

Mingun 30.04.14 в 16:08

0

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

IngaJolly 04.05.14 в 15:38

0

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

Deo 21.08.14 в 22:44

0

Для поддержки такого поведения мы должны превратить эти прямые вызовы jump() и fireGun() во что-то, что мы потом сможем поменять.

Mingun 30.04.14 в 16:10

0

Чтобы осуществить поддержку маппинга, нам нужно изменить прямые вызовы методов jump() и fireGun() на что-то, что мы можем изменить.

IngaJolly 04.05.14 в 15:40

0

Для такого нам понадобится превратить прямые вызовы методов jump() и fireGun() в нечто такое, что мы сможем заменить.

Deo 21.08.14 в 22:46

0

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

Mingun 30.04.14 в 16:11

0

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

IngaJolly 04.05.14 в 15:42

0

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

Deo 21.08.14 в 22:48

0
Минутку...

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