Game Programming Patterns / Паттерны программирования в играх: 1.1. Command
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Я начинаю с этой главы, поскольку Команда является одним из моих самых любимых шаблонов. Mingun 30.04.14 в 14:49 Я воодушевлен по поводу этой главы, поскольку Команда - один из моих любимых паттернов. IngaJolly 03.05.14 в 17:58 |
|
|
В большинстве больших программ, что я написал, будь то игры или что-либо другое, он используется в том или ином виде. Mingun 30.04.14 в 14:50 Многие большие программы, написанные мною, игры и не только, так или иначе использовали его. Deo 21.08.14 в 21:35 Так или иначе он используется в большинстве больших программ, которые я пишу, будь то игры или что-то другое. IngaJolly 23.08.14 в 17:01 |
||
|
Когда я использовал его в нужном месте, он аккуратно распутывал некоторый действительно кривой код. Mingun 30.04.14 в 14:52 При использовании в нужном месте он аккуратно распутывает угловатый код. IngaJolly 23.08.14 в 17:02 |
||
|
Для такого разбухшего шаблона «Банда четырёх» даёт предсказуемо заумное описание: Mingun 30.04.14 в 14:53 Для такого раздутого паттерна у "Банды четырех" есть предсказуемо малопонятное описание: IngaJolly 03.05.14 в 18:53 |
||
|
Инкапсулирует запрос в виде объекта, позволяя тем самым параметризовывать клиентов типом запроса, устанавливать очередность запросов, протоколировать их и поддерживать отмену выполнения операций. Mingun 30.04.14 в 15:05 Инкапсулируйте запрос в виде объекта, тем самым позволяя пользователям параметризовать клиентов по разным запросам, поставьте в очередь или залоггируйте запросы, а также организуйте поддержку отменяемых операций. IngaJolly 03.05.14 в 18:56 |
||
|
Можем ли мы согласиться, что это страшная фраза? Mingun 30.04.14 в 14:58 Мощное предложение, не правда ли? IngaJolly 03.05.14 в 18:57 Согласитесь, страшноватая фраза. Deo 21.08.14 в 21:43 |
||
|
Прежде всего она искажает всё, что пытается донести до нас эта метафора. Mingun 30.04.14 в 15:00 Прежде всего, оно искажает все, что пытается заключить эта метафора. IngaJolly 03.05.14 в 18:58 Во-первых, она искажает смысл того, что пытается до нас донести. Deo 21.08.14 в 21:49 |
||
|
Вне странного мира программного обеспечения, где слова могут означать всё, что угодно, «клиент» — это человек, кто-то, с кем вы можете вести дела. Mingun 30.04.14 в 15:01 |
||
|
Последнее, что я отметил, так это то, что люди не могут быть «параметризированными». Mingun 30.04.14 в 15:02 Вплоть до настоящего времени людей нельзя было "параметризовать". IngaJolly 03.05.14 в 18:59 Я проверял, людей нельзя "параметризовывать". Deo 21.08.14 в 21:47 |
||
|
Затем, остальная часть данного предложения является простым списком вещей, для которых вы, возможно, могли бы использовать этот шаблон. Mingun 30.04.14 в 15:07 Оставшаяся часть предложения - это просто список вещей, к которым вы, вероятно, сможете применить данный паттерн. IngaJolly 03.05.14 в 19:01 Во-вторых, оставшаяся часть фразы - это всего лишь список возможного применения этого паттерна. Deo 21.08.14 в 21:52 |
||
|
Не очень проясняет ситуацию, если ваш случай использования не находится в данном списке. Mingun 30.04.14 в 15:09 Не очень-то ясно, если вашего сценария использования нет в этом списке. IngaJolly 03.05.14 в 19:02 Не очень-то проясняет, если ваш сценарий выходит за пределы этого списка. Deo 21.08.14 в 21:53 |
||
|
Мой содержательный слоган для шаблона Команда будет таким: Mingun 30.04.14 в 15:11 Мой сжатый слоган для паттерна "команда" будет звучать так: IngaJolly 03.05.14 в 19:03 Вот мое содержательное определение для паттерна Command: Deo 21.08.14 в 21:55 |
||
|
Команда — это материализованный вызов метода. Mingun 30.04.14 в 15:11 |
||
|
«Материализация» («Reify») происходит от латинского «res» — «вещь», с добавлением английского суффикса «–fy». Так что это слово практически означает «овеществление» («thingify»), которое, честно говоря, было бы более подходящим словом. Mingun 30.04.14 в 15:18 "Материализовать" ("reify") происходит от латинского "res" — "вещь", с добавлением английского суффикса "–fy". Так что это слово буквально значит "овеществлять" ("thingify"), и этот синоним, честно говоря, больше подходит в качестве определения. IngaJolly 03.05.14 в 19:19 "Материализовывать" ("reify") происходит от латинского "res" — "вещь", с добавлением английского суффикса "–fy". То есть, это буквально означает "овеществлять", а этот синоним, честно говоря, гораздо забавнее. Deo 21.08.14 в 22:01 |
||
|
Конечно, «содержательный» часто означает «предельно краткий», так что он не может быть существенно улучшен. Mingun 30.04.14 в 15:20 Конечно, "сжатый" часто означает "предельно краткий", поэтому описание, вероятно, не очень улучшилось. IngaJolly 03.05.14 в 19:21 Естественно, "содержательное" часто значит "предельно краткое", так что это, возможно, не значительное улучшение. Deo 21.08.14 в 22:04 |
||
|
Позвольте мне немного разъяснить, что я имею ввиду. Mingun 30.04.14 в 15:20 Позвольте мне дать немного более развернутое описание. IngaJolly 03.05.14 в 19:22 |
||
|
«Материализация», в случае, если вы никогда не слышали этого слова, означает «делание реальным». Mingun 30.04.14 в 15:23 "Материализовать" (если вы никогда не слышали этого слова) означает "сделать реальным". IngaJolly 03.05.14 в 19:22 |
||
|
Другое определение материализации — делание чего-либо объектом «первого класса». Оба означают взятие какой-то концепции и превращение её в кусок данных — объект — так что вы сможете сохранить его в переменной, передать в функцию и т.д. Mingun 30.04.14 в 15:26 Другим термином для определения слова "материализовать" является сделать что-то "первым классом". Оба выражения означают взять какой-то концепт и превратить его в данные - объект - который вы можете поместить в переменную, передать на вход функции и т.д. IngaJolly 04.05.14 в 13:02 Другое определение материализации - это сделать нечто "первоклассным". Оба определения подразумевают взятие некого концепта и превращения его в данные - объект, который вы можете "засунуть" в переменную, передать в функцию и т.д. Deo 21.08.14 в 22:11 |
||
|
Таким образом, говоря, что шаблон Команда — это «материализованный вызов метода», я имею ввиду, что это вызов метода, завернутого в объект. Mingun 30.04.14 в 15:27 Таким образом, называя паттерн "команду" "вызовом материализованного метода", я имею в виду, что это вызов метода, обернутый в объект. IngaJolly 04.05.14 в 13:04 |
||
|
Всё это звучит очень похоже на «функцию обратного вызова», «функцию, как объект первого класса», «указатель на функцию», «замыкание» или «частично применяемую функцию» в зависимости от языка, из которого вы пришли, и действительно, все эти вещи означают примерно одно и тоже. Mingun 30.04.14 в 15:34 Это во многом похоже на "функцию обратного вызова", "функцию первого класса", "указатель на функцию", "замыкание" или "частично применяемую функцию", в зависимости от того, на каком языке программирования вы пишете, и, на самом деле, все это растения из одного сада. IngaJolly 04.05.14 в 13:16 |
||
|
Далее «Банда четырёх» пишет: Mingun 30.04.14 в 15:34 |
||
|
Команды представляют собой объектно-ориентированную альтернативу функциям обратного вызова. Mingun 30.04.14 в 15:41 Команды - это объектно-ориентированная замена функций обратного вызова. IngaJolly 04.05.14 в 13:17 |
+2 | |
|
Это был бы намного лучший слоган для шаблона, нежели тот, который они выбрали. Mingun 30.04.14 в 15:44 Это определение стало бы намного более удачным для паттерна, нежели то, которое они выбрали. IngaJolly 04.05.14 в 14:17 |
||
|
Но всё это несколько абстрактно и туманно. Mingun 30.04.14 в 15:45 Но все это абстрактно и туманно. IngaJolly 04.05.14 в 13:25 |
||
|
Я бы хотел начинать главы с чего-то конкретного и я сделал это. Mingun 30.04.14 в 15:51 Я люблю начинать главы с конкретики, а в этот раз у меня это не получилось. IngaJolly 04.05.14 в 13:31 Обычно мне нравится начинать главу с конкретики, но тут я провалился. Deo 21.08.14 в 22:22 |
||
|
Чтобы восполнить эту досадную оплошность, с текущего момента и дальше будут только сухие примеры, в которых команды - замечательное решение. IngaJolly 04.05.14 в 13:33 |
||
|
Система отражений в некоторых языках позволяет вам работать с типами вашей программы непосредственно во время её выполнения. Mingun 30.04.14 в 15:57 Системы рефлексии в некоторых языках программирования позволяют вам работать с типами в программе императивно во время выполнения. IngaJolly 04.05.14 в 14:07 Рефлексия в некоторых языках позволяет работать с типами императивно во время выполнения. Deo 21.08.14 в 22:26 |
||
|
Вы можете получить объект, представляющий класс какого-нибудь другого объекта, и вы можете поиграться с ним и посмотреть, что данный тип может делать. Mingun 30.04.14 в 15:59 Можно получить объект, представляющий класс другого объекта, и поиграть с ним, чтобы увидеть что тип умеет делать. Deo 21.08.14 в 22:29 Можно получить объект, представляющий класс другого объекта, и посмотреть, что может делать тип. IngaJolly 23.08.14 в 17:12 |
||
|
Другими словами, отражения — это материализованная система типов. Mingun 30.04.14 в 15:59 Другими словами, рефлексия - это материализованная система типов. IngaJolly 04.05.14 в 14:12 |
||
|
Настройка ввода Mingun 30.04.14 в 15:56 Настраиваем ввод. Deo 21.08.14 в 22:29 Настраиваем кнопки ввода IngaJolly 23.08.14 в 17:13 |
||
|
В каждой игре где-нибудь находится участок кода, считывающий непосредственный ввод пользователя — нажатия кнопок, события клавиатуры, щелчки мышью, что угодно. Mingun 30.04.14 в 16:02 В любой игре где-то есть кусок кода, который считывает необработанные данные пользователя с устройств ввода - нажатия кнопок, клавиатурные события, щелчки мышью - что угодно. IngaJolly 04.05.14 в 15:28 В каждой игре где-то есть участок кода, считывающий необработанный ввод данных пользователем - нажатия кнопок, клавиатурные события, щелчки мышью, что угодно. Deo 21.08.14 в 22:33 |
||
|
Он принимает на входе событие ввода и преобразует его в значимые действия в игре. Mingun 30.04.14 в 16:04 Он каждый раз принимает входные данные и преобразует их в имеющее смысл действие в игре. IngaJolly 04.05.14 в 15:31 Принимая каждое событие ввода, он преобразует его в осмысленное действие в игре. Deo 21.08.14 в 22:35 |
||
|
Тупейшая простая реализация выглядит как-то так: Mingun 30.04.14 в 16:04 Наипростейшая реализация выглядит примерно так: Deo 21.08.14 в 22:36 Самая простая реализация выглядит примерно так: IngaJolly 23.08.14 в 17:15 |
||
|
void InputHandler::handleInput() Mingun 30.04.14 в 15:54 |
||
|
{ Mingun 30.04.14 в 15:54 |
||
|
if (isPressed(BUTTON_X)) Mingun 30.04.14 в 15:54 |
||
|
jump(); Mingun 30.04.14 в 15:54 |
||
|
else if (isPressed(BUTTON_Y)) Mingun 30.04.14 в 15:54 |
||
|
fireGun(); Mingun 30.04.14 в 15:54 |
||
|
else if (isPressed(BUTTON_A)) Mingun 30.04.14 в 15:54 |
||
|
swapWeapon(); Mingun 30.04.14 в 15:54 |
||
|
else if (isPressed(BUTTON_B)) Mingun 30.04.14 в 15:54 |
||
|
lurchIneffectively(); Mingun 30.04.14 в 15:55 |
||
|
} Mingun 30.04.14 в 15:55 |
||
|
Совет: не нажимайте B слишком часто. Mingun 30.04.14 в 15:55 Совет новичку: не нажимайте B слишком часто. IngaJolly 04.05.14 в 15:33 |
||
|
Эта функция обычно вызывается один раз за кадр в игровом цикле. Mingun 30.04.14 в 16:05 Эта функция обычно вызывается раз в кадр паттерном Game Loop ("игровой цикл"). IngaJolly 04.05.14 в 15:36 |
||
|
Вы можете понять, что она делает. Mingun 30.04.14 в 16:06 Можно понять, что она делает. IngaJolly 23.08.14 в 17:17 |
||
|
Она работает, если мы хотим прибить гвоздями пользовательский ввод к игровым событиям, однако большинство игр позволяют пользователю настроить привязку кнопок. Mingun 30.04.14 в 16:08 Она работает, если мы хотим жестко привязать кнопки ввода к игровым действиям, но многие игры разрешают пользователям переназначать кнопки. IngaJolly 04.05.14 в 15:38 Это срабатывает в случае, если мы хотим жестко связать ввод пользователя с игровыми действиям, однако многие игры позволяют пользователю переназначать кнопки. Deo 21.08.14 в 22:44 |
||
|
Для поддержки такого поведения мы должны превратить эти прямые вызовы jump() и fireGun() во что-то, что мы потом сможем поменять. Mingun 30.04.14 в 16:10 Чтобы осуществить поддержку маппинга, нам нужно изменить прямые вызовы методов jump() и fireGun() на что-то, что мы можем изменить. IngaJolly 04.05.14 в 15:40 Для такого нам понадобится превратить прямые вызовы методов jump() и fireGun() в нечто такое, что мы сможем заменить. Deo 21.08.14 в 22:46 |
||
|
«Поменять» звучит как присвоение переменной, так что нам нужен объект, который мы могли бы использовать для представления игровых действий. Mingun 30.04.14 в 16:11 "Изменить" ассоциируется с назначением переменной, поэтому нам нужен объект, который мы можем использовать для отображения игрового действия. IngaJolly 04.05.14 в 15:42 "Заменить" звучит совсем как "присвоить значение переменной", а значит нам понадобится объект, который мы используем для представления игрового действия. Deo 21.08.14 в 22:48 |
