Game Programming Patterns / Паттерны программирования в играх: 1.3. Observer
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Куда ни плюнь, повсюду приложения создаются с использование схемы MVC(Модель-Предстваление-Контроллер), в основе которой лежит паттерн Observer(Наблюдатель). kamillxiii 30.04.14 в 17:38 Стоит только бросить камень в жесткий диск, как обязательно попадешь в приложение, построенное на архитектуре "модель-представление-контроллер" (Model-View-Controller), и в основе ее лежит паттерн "наблюдатель" (Observer). IngaJolly 23.05.14 в 17:40 |
|
|
Observer настолько популярен, что в языке Java он доступен из коробки (java.util.Observer), а в C# его встроили прямо в язык (в качестве ключевого слова). kamillxiii 30.04.14 в 17:43 "Наблюдатель" так распространен, что находится в основной библиотеке Java (java. IngaJolly 23.05.14 в 17:42 Observer настолько популярен, что в языке Java он встроен в ядро (java.util.Observer), а в C# его можно вызвать ключевым словом «event». Evsign 23.05.14 в 22:20 |
+1 | |
|
- kamillxiii 01.05.14 в 03:29 util. IngaJolly 23.05.14 в 17:42 |
||
|
- kamillxiii 01.05.14 в 03:29 Observer) IngaJolly 23.05.14 в 17:42 |
||
|
- kamillxiii 01.05.14 в 03:29 и в C# это встроено прямо в язык (ключевое слово event). Vladislav86 06.05.14 в 12:53 , а в C# - прямо внутри языка (ключевое слово "event"). IngaJolly 23.05.14 в 17:49 |
||
|
Как и многие иные вещи в программировании, паттерн MVC был придуман Smalltalk-программистами в 70-х. kamillxiii 30.04.14 в 17:44 Как и многое в программировании, MVC было изобретено программистами Smalltalk в 70-х. IngaJolly 23.05.14 в 17:52 |
||
|
Лисп-кодеры, вероятно, будут утвержать, что это они его изобрели еще в 60-х, но просто не потрудились его записать. kamillxiii 30.04.14 в 17:46 Программисты языка Lisp, возможно, заявляют, что они придумали это в 1960-х годах, но не побеспокоились записать на бумаге. IngaJolly 23.05.14 в 17:53 Программисты Lisp, наверное, утверждают, что придумали его еще в 60-х, но не стали документировать. IngaJolly 26.08.14 в 21:33 |
||
|
Паттерн Observer один из наиболее широко распространенных и часто используемых оригинальных паттернов "Банды Четрырех", однако, мир игростроя временами бывает настолько погружен в себя, что для его обитателей все они могут быть в новинку. kamillxiii 30.04.14 в 17:52 "Наблюдатель" - один из самых широко используемых и известных оригинальных паттернов "Банды четырех", но мир разработки игр временами может быть странно уединенным, поэтому, возможно, вы слышите о нем в первый раз. IngaJolly 23.05.14 в 17:57 |
||
|
Поскольку, надеюсь, вы не с луны свалились, позвольте продемонстрировать вам мотивирующий пример. kamillxiii 30.04.14 в 17:56 Если ваше затворничество продлилось до сих пор, позвольте мне продемонстрировать мотивирующий пример. IngaJolly 23.05.14 в 17:58 |
||
|
Получено достижение kamillxiii 30.04.14 в 17:56 Разблокировано достижение IngaJolly 23.05.14 в 17:58 |
||
|
Допустим, вы добавляете систему достижений в свою игру. kamillxiii 30.04.14 в 17:57 Допустим, вы добавляете в игру систему достижений. IngaJolly 26.08.14 в 21:37 |
||
|
Она будет включать в себя уйму разных значков, зарабатываемых игроками за завершение определенных этапов игры, как, например: "Убить 100 Обезъянодемонов", "Упасть с моста", или "Пройти уровень, используя только Мертвого Хорька". kamillxiii 30.04.14 в 18:01 В ней будут десятки различных значков, которые игроки могут заработать за завершение определенных этапов, например "Убить 100 демонов-обезьян", "Упасть с моста" или "Завершить уровень, имея на руках только мертвую ласку". IngaJolly 06.06.14 в 13:56 |
||
|
Клянусь, здесь нет двусмысленностей. kamillxiii 30.04.14 в 18:04 Клянусь, здесь нет никакой двусмысленности. IngaJolly 06.06.14 в 13:57 |
||
|
Это довольно сложно сделать, так как у вас такой большой набор достижений, которые открываются всеми мыслимыми и немыслимыми способами. kamillxiii 30.04.14 в 18:06 Нелегко реализовать это чисто, потому что в наличии огромный диапазон достижений, подлежащих разблокировке всевозможными способами. IngaJolly 17.06.14 в 16:20 |
||
|
Если не быть аккуратным, то щупальца вашей системы достижений проникнут в каждый уголок вашего кода. kamillxiii 30.04.14 в 18:08 Без должной аккуратности отростки системы достижений обовьют каждый темный угол кодовой базы. IngaJolly 17.06.14 в 16:22 |
||
|
Разумеется, достижение "Упасть с моста" как-то связано с физическим движком, но разве видеть вызов метода "открытьДостижениеПриПаденииСМоста()" прямо посреди вычислений в алгоритме столкновений это действительно то, что вы хотите? kamillxiii 30.04.14 в 18:12 Конечно "Упасть с моста" каким-то образом привязано к физическому движку, но нужен ли вызов unlockFallOffBridge() прямо в сердце линейной алгебры в алгоритме разрешения коллизий? IngaJolly 17.06.14 в 16:24 |
||
|
Это риторический вопрос. kamillxiii 30.04.14 в 18:13 |
||
|
Ни один уважающий себя программист физики никогда не позволит заляпать свои прекрасные математические расчёты чем-то таким прозаичным, как элемент геймплея. kamillxiii 30.04.14 в 18:16 Ни один уважающий себя программист физики не позволит пачкать красивую математику чем-то столь скучным, как геймплей. IngaJolly 17.06.14 в 16:26 |
||
|
Что мы действительно бы хотели, это, как всегда, иметь весь код, относящийся к одному аспекту игры красиво собранным в одном месте. kamillxiii 30.04.14 в 18:19 Как всегда, мы хотим, чтобы код одного аспекта игры был красиво собран в единственном месте. IngaJolly 26.08.14 в 21:46 |
||
|
Проблема в том, что достижения срабатывают от совокупности различных игровых аспектов. kamillxiii 30.04.14 в 18:24 Проблема в том, что достижения срабатывают от различных аспектов геймплея. IngaJolly 17.06.14 в 16:40 |
||
|
Как это может работать без слияния кода достижений со всем остальным? kamillxiii 30.04.14 в 18:26 Если код достижений не будет связан с этими аспектами, как можно добиться работоспособности? IngaJolly 17.06.14 в 16:41 |
||
|
Именно для этих целей предназначен паттерн Observer. kamillxiii 30.04.14 в 18:27 Для этого существует паттерн Observer. Lonely_Wolf 06.05.14 в 14:49 Для этого предназначен паттерн "Наблюдатель" (Observer). IngaJolly 17.06.14 в 16:42 |
||
|
Он позволяет одной части кода оповещать, что произошло нечто интересное, не особо заботясь о получателях. kamillxiii 01.05.14 в 02:42 С его помощью код объявляет о том, что случилось что-то интересное, не заботясь о получателе уведомления. IngaJolly 17.06.14 в 16:44 |
||
|
К примеру, у вас есть какой-то код физики, который управляет гравитацией и следит, кто отдыхает на удобных плоских поверхностях, а кто падает навстречу неминуемой гибели. kamillxiii 01.05.14 в 02:48 К примеру, есть код физики, управляющий гравитацией и отслеживающий, чьи тела отдыхают на приятных плоских поверхностях, а чьи падают навстречу неминуемой гибели. IngaJolly 26.08.14 в 21:52 |
||
|
Чтобы отследить достижение "Упасть с моста", вы можете поместить код проверки прямо сюда - но это бардак. kamillxiii 01.05.14 в 02:50 Чтобы реализовать значок "Упасть с моста", можно просто добавить сюда код достижений, но получится месиво. IngaJolly 17.06.14 в 16:47 |
||
|
Вместо этого можно просто сделать: kamillxiii 01.05.14 в 02:51 Вместо этого можно сделать так: IngaJolly 17.06.14 в 16:48 |
||
|
void Physics::updateBody(PhysicsBody& body) kamillxiii 01.05.14 в 02:51 |
||
|
{ kamillxiii 01.05.14 в 02:52 |
||
|
bool wasOnSurface = body. kamillxiii 01.05.14 в 02:52 |
||
|
isOnSurface(); kamillxiii 01.05.14 в 02:52 |
||
|
body. kamillxiii 01.05.14 в 02:52 |
||
|
accelerate(GRAVITY) kamillxiii 01.05.14 в 02:52 |
||
|
; kamillxiii 01.05.14 в 02:52 |
||
|
body. kamillxiii 01.05.14 в 02:52 |
||
|
update(); kamillxiii 01.05.14 в 02:52 |
||
|
if (wasOnSurface && !body. kamillxiii 01.05.14 в 02:52 |
||
|
isOnSurface()) kamillxiii 01.05.14 в 02:52 |
||
|
{ kamillxiii 01.05.14 в 02:53 |
||
|
notify(body, EVENT_START_FALL) kamillxiii 01.05.14 в 02:53 |
||
|
; kamillxiii 01.05.14 в 02:53 |
||
|
} kamillxiii 01.05.14 в 02:53 |
||
|
} kamillxiii 01.05.14 в 02:53 |
||
|
Все, что этот код делает, это говорит: "Эм, не знаю кого это заботит, но эта штука только что упала. kamillxiii 01.05.14 в 02:56 Все, что делает этот код: "Хм, не знаю, заботит ли это кого-нибудь, но эта штука только что упала. IngaJolly 17.06.14 в 16:53 |
||
|
Делай, что с сочтешь нужным." kamillxiii 01.05.14 в 02:56 Делайте с этим, что хотите". IngaJolly 17.06.14 в 16:54 |
||
|
Физический движок все же должен решить, какое сообщение отправить, то есть он не полностью отделен. kamillxiii 01.05.14 в 02:58 Физический движок обязан решить, какие уведомления слать, поэтому здесь нет полной декомпозиции. IngaJolly 17.06.14 в 16:56 |
||
|
Но при проектировании мы чаще стараемся сделать системы лучше, а не совершенными. kamillxiii 01.05.14 в 03:00 Основная цель архитектуры - сделать систему лучше, но никто не ждет идеала. IngaJolly 17.06.14 в 16:58 |
||
|
Система достижений регистрирует себя, так что каждый раз при отправке физическим движком сообщения она получает его. kamillxiii 01.05.14 в 03:02 Система достижений регистрирует сама себя, поэтому когда код физики посылает уведомление, достижение получает его. IngaJolly 17.06.14 в 17:00 |
||
|
Потом она может проверить является ли падающее тело нашим слегка неуклюжим героем, и возвышался ли он на мосту непосредственно перед неприятным взаимодействием с законами классической механики. kamillxiii 01.05.14 в 03:12 Затем можно проверить, является ли падающее тело неуклюжим героем и был ли он на мосту до этого неприятного столкновения с классической механикой. IngaJolly 17.06.14 в 17:26 |
||
|
Если да, она открывает соответствующее достижение с сопутствующими фейерверками и фанфарами, и все это не затрагивая код физики. kamillxiii 01.05.14 в 03:18 Если да, разблокируется соответствующее достижение под фейерверки и фанфары, и все это без вовлечения кода физики. IngaJolly 17.06.14 в 17:52 |
||
|
Фактически, вы можете менять набор достижений или целиком убрать систему достижений, не касаясь ни единой строчки кода физического движка. kamillxiii 01.05.14 в 03:20 На самом деле можно изменить набор достижений или удалить всю систему достижений, не тронув ни строки физического движка. IngaJolly 17.06.14 в 17:54 |
