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

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

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

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

kamillxiii 01.05.14 в 06:34

1

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

IngaJolly 17.06.14 в 17:56

0

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

kamillxiii 01.05.14 в 06:36

1

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

IngaJolly 17.06.14 в 17:57

0

Но в процессе эволюции игры неплохо иметь такую гибкость.

kamillxiii 01.05.14 в 06:38

2

Как это работает

kamillxiii 01.05.14 в 06:38

2

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

kamillxiii 01.05.14 в 06:44

0

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

IngaJolly 17.06.14 в 18:00

0

The Observer

kamillxiii 01.05.14 в 06:44

0

Наблюдатель

Mingun 03.05.14 в 17:57

0

The Observer (Наблюдатель)

kSky7000 06.05.14 в 15:59

1

"Наблюдатель" (Observer)

IngaJolly 17.06.14 в 17:58

0

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

kamillxiii 01.05.14 в 06:46

1

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

IngaJolly 17.06.14 в 18:01

0

Этому классу соответствует код:

kamillxiii 01.05.14 в 06:46

1

Достигнем этого с помощью следующей реализации:

IngaJolly 17.06.14 в 18:02

0

class Observer

kamillxiii 01.05.14 в 06:47

1

{

kamillxiii 01.05.14 в 06:47

1

public:

kamillxiii 01.05.14 в 06:47

1

virtual ~Observer() {}

kamillxiii 01.05.14 в 06:47

1

virtual void onNotify(const Entity& entity, Event event)

kamillxiii 01.05.14 в 06:47

1

= 0;

kamillxiii 01.05.14 в 06:47

1

};

kamillxiii 01.05.14 в 06:47

1

Параметры для метода onNotify() остаются за вами.

kamillxiii 01.05.14 в 06:49

1

Какие параметры передавать в onNotify() - решать вам.

IngaJolly 17.06.14 в 18:03

0

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

kamillxiii 01.05.14 в 06:56

0

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

IngaJolly 17.06.14 в 18:06

0

Если вы пишете на языке с обобщениями(generics) или шаблонами(templates), то, возможно, будете их использовать, но также неплохо связать их с вашим конкретный случаем.

kamillxiii 01.05.14 в 06:59

1

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

IngaJolly 17.06.14 в 18:09

0

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

kamillxiii 01.05.14 в 11:02

1

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

IngaJolly 17.06.14 в 18:11

0

Любой класс, наследующий этот, становится наблюдателем.

kamillxiii 01.05.14 в 11:03

1

Любой класс, реализующий этот метод, считается наблюдателем.

GromHoll 11.06.14 в 11:55

0

Любой класс, реализующий это, становится "наблюдателем".

IngaJolly 17.06.14 в 18:11

0

В нашем примере это система достижений, так что у нас получится нечто вроде:

kamillxiii 01.05.14 в 11:04

1

В нашем примере это система достижений, поэтому получится что-то вроде этого:

IngaJolly 27.08.14 в 18:05

0

class Achievements : public Observer

kamillxiii 01.05.14 в 06:47

1

{

kamillxiii 01.05.14 в 06:47

1

public:

kamillxiii 01.05.14 в 06:47

1

virtual void onNotify(const Entity& entity, Event event)

kamillxiii 01.05.14 в 06:47

1

{

kamillxiii 01.05.14 в 06:48

1

switch (event)

kamillxiii 01.05.14 в 06:48

1

{

kamillxiii 01.05.14 в 06:48

1

case EVENT_ENTITY_FELL:

kamillxiii 01.05.14 в 06:48

1

if (entity.

kamillxiii 01.05.14 в 06:48

1

isHero() && heroIsOnBridge_)

kamillxiii 01.05.14 в 06:48

1

{

kamillxiii 01.05.14 в 06:48

1

unlock(ACHIEVEMENT_FELL_OFF_BRIDGE)

kamillxiii 01.05.14 в 06:48

1

;

kamillxiii 01.05.14 в 06:48

1

}

kamillxiii 01.05.14 в 06:48

1

break;

kamillxiii 01.05.14 в 06:48

1

// Обрабатываем остальные события и обновляем herolsOnBridge_...

kamillxiii 01.05.14 в 11:05

1

// Обработать другие события и обновить herolsOnBridge_...

IngaJolly 27.08.14 в 18:06

0

}

kamillxiii 01.05.14 в 06:48

1

}

kamillxiii 01.05.14 в 06:48

1

private:

kamillxiii 01.05.14 в 06:48

1

void unlock(Achievement achievement)

kamillxiii 01.05.14 в 06:48

1

{

kamillxiii 01.05.14 в 06:48

1

// Открыть, если еще открыто...

kamillxiii 01.05.14 в 11:05

0

// Открываем, если ещё не открыто...

Mingun 03.05.14 в 17:59

0

// Разблокировать, если еще не разблокировано...

IngaJolly 17.06.14 в 18:15

0

}

kamillxiii 01.05.14 в 06:48

1

bool heroIsOnBridge_;

kamillxiii 01.05.14 в 06:48

1

};

kamillxiii 01.05.14 в 06:48

1

Субъект

kamillxiii 01.05.14 в 11:05

2

Метод сообщения вызывается объектом, за которым наблюдают.

kamillxiii 01.05.14 в 11:06

1

Метод уведомления вызывается объектом, за которым наблюдают.

IngaJolly 17.06.14 в 18:17

0

Или если говорить языком "Банды Четырёх", субъектом. У него две цели.

kamillxiii 01.05.14 в 11:07

1

На языке "Банды четырех" этот объект называется "субъектом". У него две задачи.

IngaJolly 17.06.14 в 18:19

0

Первая - это хранить список наблюдателей которые так терпеливо ждут его послания:

kamillxiii 01.05.14 в 11:09

1

Первая - хранение списка "наблюдателей", которые терпеливо ждут послания:

IngaJolly 17.06.14 в 18:21

0
Минутку...

← Предыдущая страница

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