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

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

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

Куда ни плюнь, повсюду приложения создаются с использование схемы MVC(Модель-Предстваление-Контроллер), в основе которой лежит паттерн Observer(Наблюдатель).

kamillxiii 30.04.14 в 17:38

3

Стоит только бросить камень в жесткий диск, как обязательно попадешь в приложение, построенное на архитектуре "модель-представление-контроллер" (Model-View-Controller), и в основе ее лежит паттерн "наблюдатель" (Observer).

IngaJolly 23.05.14 в 17:40

0

Observer настолько популярен, что в языке Java он доступен из коробки (java.util.Observer), а в C# его встроили прямо в язык (в качестве ключевого слова).

kamillxiii 30.04.14 в 17:43

4

"Наблюдатель" так распространен, что находится в основной библиотеке Java (java.

IngaJolly 23.05.14 в 17:42

0

Observer настолько популярен, что в языке Java он встроен в ядро (java.util.Observer), а в C# его можно вызвать ключевым словом «event».

Evsign 23.05.14 в 22:20

0
+1

-

kamillxiii 01.05.14 в 03:29

1

util.

IngaJolly 23.05.14 в 17:42

0

-

kamillxiii 01.05.14 в 03:29

1

Observer)

IngaJolly 23.05.14 в 17:42

0

-

kamillxiii 01.05.14 в 03:29

1

и в C# это встроено прямо в язык (ключевое слово event).

Vladislav86 06.05.14 в 12:53

0

, а в C# - прямо внутри языка (ключевое слово "event").

IngaJolly 23.05.14 в 17:49

0

Как и многие иные вещи в программировании, паттерн MVC был придуман Smalltalk-программистами в 70-х.

kamillxiii 30.04.14 в 17:44

1

Как и многое в программировании, MVC было изобретено программистами Smalltalk в 70-х.

IngaJolly 23.05.14 в 17:52

0

Лисп-кодеры, вероятно, будут утвержать, что это они его изобрели еще в 60-х, но просто не потрудились его записать.

kamillxiii 30.04.14 в 17:46

1

Программисты языка Lisp, возможно, заявляют, что они придумали это в 1960-х годах, но не побеспокоились записать на бумаге.

IngaJolly 23.05.14 в 17:53

1

Программисты Lisp, наверное, утверждают, что придумали его еще в 60-х, но не стали документировать.

IngaJolly 26.08.14 в 21:33

0

Паттерн Observer один из наиболее широко распространенных и часто используемых оригинальных паттернов "Банды Четрырех", однако, мир игростроя временами бывает настолько погружен в себя, что для его обитателей все они могут быть в новинку.

kamillxiii 30.04.14 в 17:52

1

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

IngaJolly 23.05.14 в 17:57

0

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

kamillxiii 30.04.14 в 17:56

2

Если ваше затворничество продлилось до сих пор, позвольте мне продемонстрировать мотивирующий пример.

IngaJolly 23.05.14 в 17:58

0

Получено достижение

kamillxiii 30.04.14 в 17:56

2

Разблокировано достижение

IngaJolly 23.05.14 в 17:58

0

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

kamillxiii 30.04.14 в 17:57

1

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

IngaJolly 26.08.14 в 21:37

0

Она будет включать в себя уйму разных значков, зарабатываемых игроками за завершение определенных этапов игры, как, например: "Убить 100 Обезъянодемонов", "Упасть с моста", или "Пройти уровень, используя только Мертвого Хорька".

kamillxiii 30.04.14 в 18:01

1

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

IngaJolly 06.06.14 в 13:56

0

Клянусь, здесь нет двусмысленностей.

kamillxiii 30.04.14 в 18:04

1

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

IngaJolly 06.06.14 в 13:57

0

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

kamillxiii 30.04.14 в 18:06

1

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

IngaJolly 17.06.14 в 16:20

0

Если не быть аккуратным, то щупальца вашей системы достижений проникнут в каждый уголок вашего кода.

kamillxiii 30.04.14 в 18:08

1

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

IngaJolly 17.06.14 в 16:22

0

Разумеется, достижение "Упасть с моста" как-то связано с физическим движком, но разве видеть вызов метода "открытьДостижениеПриПаденииСМоста()" прямо посреди вычислений в алгоритме столкновений это действительно то, что вы хотите?

kamillxiii 30.04.14 в 18:12

1

Конечно "Упасть с моста" каким-то образом привязано к физическому движку, но нужен ли вызов unlockFallOffBridge() прямо в сердце линейной алгебры в алгоритме разрешения коллизий?

IngaJolly 17.06.14 в 16:24

0

Это риторический вопрос.

kamillxiii 30.04.14 в 18:13

2

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

kamillxiii 30.04.14 в 18:16

1

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

IngaJolly 17.06.14 в 16:26

0

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

kamillxiii 30.04.14 в 18:19

1

Как всегда, мы хотим, чтобы код одного аспекта игры был красиво собран в единственном месте.

IngaJolly 26.08.14 в 21:46

0

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

kamillxiii 30.04.14 в 18:24

1

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

IngaJolly 17.06.14 в 16:40

0

Как это может работать без слияния кода достижений со всем остальным?

kamillxiii 30.04.14 в 18:26

1

Если код достижений не будет связан с этими аспектами, как можно добиться работоспособности?

IngaJolly 17.06.14 в 16:41

0

Именно для этих целей предназначен паттерн Observer.

kamillxiii 30.04.14 в 18:27

0

Для этого существует паттерн Observer.

Lonely_Wolf 06.05.14 в 14:49

0

Для этого предназначен паттерн "Наблюдатель" (Observer).

IngaJolly 17.06.14 в 16:42

0

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

kamillxiii 01.05.14 в 02:42

0

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

IngaJolly 17.06.14 в 16:44

0

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

kamillxiii 01.05.14 в 02:48

1

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

IngaJolly 26.08.14 в 21:52

0

Чтобы отследить достижение "Упасть с моста", вы можете поместить код проверки прямо сюда - но это бардак.

kamillxiii 01.05.14 в 02:50

1

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

IngaJolly 17.06.14 в 16:47

0

Вместо этого можно просто сделать:

kamillxiii 01.05.14 в 02:51

1

Вместо этого можно сделать так:

IngaJolly 17.06.14 в 16:48

0

void Physics::updateBody(PhysicsBody& body)

kamillxiii 01.05.14 в 02:51

1

{

kamillxiii 01.05.14 в 02:52

1

bool wasOnSurface = body.

kamillxiii 01.05.14 в 02:52

1

isOnSurface();

kamillxiii 01.05.14 в 02:52

1

body.

kamillxiii 01.05.14 в 02:52

1

accelerate(GRAVITY)

kamillxiii 01.05.14 в 02:52

1

;

kamillxiii 01.05.14 в 02:52

1

body.

kamillxiii 01.05.14 в 02:52

1

update();

kamillxiii 01.05.14 в 02:52

1

if (wasOnSurface && !body.

kamillxiii 01.05.14 в 02:52

1

isOnSurface())

kamillxiii 01.05.14 в 02:52

1

{

kamillxiii 01.05.14 в 02:53

1

notify(body, EVENT_START_FALL)

kamillxiii 01.05.14 в 02:53

1

;

kamillxiii 01.05.14 в 02:53

1

}

kamillxiii 01.05.14 в 02:53

1

}

kamillxiii 01.05.14 в 02:53

1

Все, что этот код делает, это говорит: "Эм, не знаю кого это заботит, но эта штука только что упала.

kamillxiii 01.05.14 в 02:56

2

Все, что делает этот код: "Хм, не знаю, заботит ли это кого-нибудь, но эта штука только что упала.

IngaJolly 17.06.14 в 16:53

0

Делай, что с сочтешь нужным."

kamillxiii 01.05.14 в 02:56

1

Делайте с этим, что хотите".

IngaJolly 17.06.14 в 16:54

0

Физический движок все же должен решить, какое сообщение отправить, то есть он не полностью отделен.

kamillxiii 01.05.14 в 02:58

1

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

IngaJolly 17.06.14 в 16:56

0

Но при проектировании мы чаще стараемся сделать системы лучше, а не совершенными.

kamillxiii 01.05.14 в 03:00

1

Основная цель архитектуры - сделать систему лучше, но никто не ждет идеала.

IngaJolly 17.06.14 в 16:58

0

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

kamillxiii 01.05.14 в 03:02

1

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

IngaJolly 17.06.14 в 17:00

0

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

kamillxiii 01.05.14 в 03:12

1

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

IngaJolly 17.06.14 в 17:26

0

Если да, она открывает соответствующее достижение с сопутствующими фейерверками и фанфарами, и все это не затрагивая код физики.

kamillxiii 01.05.14 в 03:18

1

Если да, разблокируется соответствующее достижение под фейерверки и фанфары, и все это без вовлечения кода физики.

IngaJolly 17.06.14 в 17:52

0

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

kamillxiii 01.05.14 в 03:20

1

На самом деле можно изменить набор достижений или удалить всю систему достижений, не тронув ни строки физического движка.

IngaJolly 17.06.14 в 17:54

0
Минутку...

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