Game Programming Patterns / Паттерны программирования в играх: 1.3. Observer
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Он и дальше будет отправлять сообщения, несмотря на факт того, что никто их больше не получает. kamillxiii 01.05.14 в 06:34 По-прежнему будут отсылаться уведомления, несмотря на то, что никто их больше не получает. IngaJolly 17.06.14 в 17:56 |
|
|
Конечно, если вы навсегда уберете достижения и никто и никогда больше не будет принимать сообщения физического движка, вы можете также убрать и код оповещений. kamillxiii 01.05.14 в 06:36 Конечно, если окончательно удалить достижения, зная, что никто больше не будет принимать уведомления физического движка, можно удалить и код уведомлений. IngaJolly 17.06.14 в 17:57 |
||
|
Но в процессе эволюции игры неплохо иметь такую гибкость. kamillxiii 01.05.14 в 06:38 |
||
|
Как это работает kamillxiii 01.05.14 в 06:38 |
||
|
Если вы еще не знали, как построить этот паттерн, то, возможно, уже догадались из предыдущего обсуждения, но чтобы вам было ясно, я быстро по нему пробегусь. kamillxiii 01.05.14 в 06:44 Если вы все еще не знаете, как реализовать паттерн, то, возможно, догадаетесь из предыдущего описания, но для облегчения задачи я быстро рассмотрю этот вопрос. IngaJolly 17.06.14 в 18:00 |
||
|
The Observer kamillxiii 01.05.14 в 06:44 Наблюдатель Mingun 03.05.14 в 17:57 The Observer (Наблюдатель) kSky7000 06.05.14 в 15:59 "Наблюдатель" (Observer) IngaJolly 17.06.14 в 17:58 |
||
|
Мы начнем с любопытствующего класса, который хочет знать, когда другой объект делает что-то интересное. kamillxiii 01.05.14 в 06:46 Мы начнем с любопытствующего класса, который хочет быть в курсе, когда другой объект делает что-то интересное. IngaJolly 17.06.14 в 18:01 |
||
|
Этому классу соответствует код: kamillxiii 01.05.14 в 06:46 Достигнем этого с помощью следующей реализации: IngaJolly 17.06.14 в 18:02 |
||
|
class Observer kamillxiii 01.05.14 в 06:47 |
||
|
{ kamillxiii 01.05.14 в 06:47 |
||
|
public: kamillxiii 01.05.14 в 06:47 |
||
|
virtual ~Observer() {} kamillxiii 01.05.14 в 06:47 |
||
|
virtual void onNotify(const Entity& entity, Event event) kamillxiii 01.05.14 в 06:47 |
||
|
= 0; kamillxiii 01.05.14 в 06:47 |
||
|
}; kamillxiii 01.05.14 в 06:47 |
||
|
Параметры для метода onNotify() остаются за вами. kamillxiii 01.05.14 в 06:49 Какие параметры передавать в onNotify() - решать вам. IngaJolly 17.06.14 в 18:03 |
||
|
Именно поэтому это паттерн Observer, а не "готовый код, который вы можете вставить в свою игру". Обычно параметрами являются объект, который отправил оповещение, и обобщенный параметр "данные", в который вы складываете остальные детали. kamillxiii 01.05.14 в 06:56 Вот почему это паттерн "Наблюдатель", а не "готовый код-наблюдатель, который можно вставить в игру". Обычные параметры - объект, пославший уведомление, и настраиваемый параметр "data", в котором хранятся остальные данные. IngaJolly 17.06.14 в 18:06 |
||
|
Если вы пишете на языке с обобщениями(generics) или шаблонами(templates), то, возможно, будете их использовать, но также неплохо связать их с вашим конкретный случаем. kamillxiii 01.05.14 в 06:59 Если язык имеет настраиваемые параметры или шаблоны, то можно использовать их здесь, но также неплохо адаптировать код к определенному сценарию использования. IngaJolly 17.06.14 в 18:09 |
||
|
Здесь я просто заставлю его принимать игровую сущность и перечисление, описывающее случившееся. kamillxiii 01.05.14 в 11:02 Здесь я пишу жесткий код, принимая на вход игровую сущность и перечисление, описывающее происшедшее. IngaJolly 17.06.14 в 18:11 |
||
|
Любой класс, наследующий этот, становится наблюдателем. kamillxiii 01.05.14 в 11:03 Любой класс, реализующий этот метод, считается наблюдателем. GromHoll 11.06.14 в 11:55 Любой класс, реализующий это, становится "наблюдателем". IngaJolly 17.06.14 в 18:11 |
||
|
В нашем примере это система достижений, так что у нас получится нечто вроде: kamillxiii 01.05.14 в 11:04 В нашем примере это система достижений, поэтому получится что-то вроде этого: IngaJolly 27.08.14 в 18:05 |
||
|
class Achievements : public Observer kamillxiii 01.05.14 в 06:47 |
||
|
{ kamillxiii 01.05.14 в 06:47 |
||
|
public: kamillxiii 01.05.14 в 06:47 |
||
|
virtual void onNotify(const Entity& entity, Event event) kamillxiii 01.05.14 в 06:47 |
||
|
{ kamillxiii 01.05.14 в 06:48 |
||
|
switch (event) kamillxiii 01.05.14 в 06:48 |
||
|
{ kamillxiii 01.05.14 в 06:48 |
||
|
case EVENT_ENTITY_FELL: kamillxiii 01.05.14 в 06:48 |
||
|
if (entity. kamillxiii 01.05.14 в 06:48 |
||
|
isHero() && heroIsOnBridge_) kamillxiii 01.05.14 в 06:48 |
||
|
{ kamillxiii 01.05.14 в 06:48 |
||
|
unlock(ACHIEVEMENT_FELL_OFF_BRIDGE) kamillxiii 01.05.14 в 06:48 |
||
|
; kamillxiii 01.05.14 в 06:48 |
||
|
} kamillxiii 01.05.14 в 06:48 |
||
|
break; kamillxiii 01.05.14 в 06:48 |
||
|
// Обрабатываем остальные события и обновляем herolsOnBridge_... kamillxiii 01.05.14 в 11:05 // Обработать другие события и обновить herolsOnBridge_... IngaJolly 27.08.14 в 18:06 |
||
|
} kamillxiii 01.05.14 в 06:48 |
||
|
} kamillxiii 01.05.14 в 06:48 |
||
|
private: kamillxiii 01.05.14 в 06:48 |
||
|
void unlock(Achievement achievement) kamillxiii 01.05.14 в 06:48 |
||
|
{ kamillxiii 01.05.14 в 06:48 |
||
|
// Открыть, если еще открыто... kamillxiii 01.05.14 в 11:05 // Открываем, если ещё не открыто... Mingun 03.05.14 в 17:59 // Разблокировать, если еще не разблокировано... IngaJolly 17.06.14 в 18:15 |
||
|
} kamillxiii 01.05.14 в 06:48 |
||
|
bool heroIsOnBridge_; kamillxiii 01.05.14 в 06:48 |
||
|
}; kamillxiii 01.05.14 в 06:48 |
||
|
Субъект kamillxiii 01.05.14 в 11:05 |
||
|
Метод сообщения вызывается объектом, за которым наблюдают. kamillxiii 01.05.14 в 11:06 Метод уведомления вызывается объектом, за которым наблюдают. IngaJolly 17.06.14 в 18:17 |
||
|
Или если говорить языком "Банды Четырёх", субъектом. У него две цели. kamillxiii 01.05.14 в 11:07 На языке "Банды четырех" этот объект называется "субъектом". У него две задачи. IngaJolly 17.06.14 в 18:19 |
||
|
Первая - это хранить список наблюдателей которые так терпеливо ждут его послания: kamillxiii 01.05.14 в 11:09 Первая - хранение списка "наблюдателей", которые терпеливо ждут послания: IngaJolly 17.06.14 в 18:21 |
