Разработка игр Objective-C: связь между компонентами - PullRequest
2 голосов
/ 04 сентября 2011

Я использую инфраструктуру разработки игр Cocos2d для iPhone.

Давайте сосредоточимся на сцене битвы:

Сцена битвы имеет детей: слой бойцов, слой HUD, слой меню, фоновый слой и т.д ...

Иногда необходимо, чтобы мой слой бойцов "связывался" с моим слоем HUD (например, вызывал функцию внутри него).

Мне сложно. По сути, моему слою бойцов нужен какой-то .. экземпляр или ссылка на слой HUD, чтобы вызвать функцию внутри него, верно? Но я не знаю, как получить такую ​​вещь.

В настоящее время это то, что я делаю:

Слой Battlers запустит функцию на сцене (ее родитель), и внутри такой функции я "найду" дочерний слой HUD и вызову нужную мне функцию.

Так вот, это немного неудобно. Что бы вы сделали в такой ситуации?

Ответы [ 3 ]

3 голосов
/ 04 сентября 2011

Мне кажется, что вы, возможно, переоценили это. Что я могу сделать, это что-то вроде этого.

Я бы получил сцену IS. Каждый из моих классов сцены реализует эту IScene. У IScene есть свойство под названием «HUD», другое - «Меню» и т. Д.

Текущий IScene установлен в глобальный статический экземпляр :: CurrentScene

Когда текущая сцена должна связаться с меню, я говорю: :: CurrentScene-> Menu-> SomeFuncion ().

Будет ли это работать для вас?

2 голосов
/ 04 сентября 2011

Вы можете использовать NSNotification Center.Это позволяет отправлять сообщения в одном объекте и реагировать на них несколькими другими объектами.

// The object that wants to receive the message registers with NSNotificationcenter
[[NSNotificationCenter defaultCenter]
  addObserver:self
  selector:@selector(receiveScoreUpdateEvent:)
  name:@"scoreUpdateEvent"
  object:nil ];

В этом же объекте необходимо определить метод, на который указывает селектор:

- (void)startLocating:(NSNotification *)notification {
    NSNumber *scoreObject = [[notification userInfo] objectForKey:@"score"];
    // Do something with the new score
}

Другой объект может затем отправить сообщение с обновленным счетом в любое время, и ваш HUD отреагирует на него:

[[NSNotificationCenter defaultCenter] postNotificationName:@"scoreUpdateEvent"
  object:self userInfo:[NSNumber numberWithInt:5345] forKey:@"score"]];
2 голосов
/ 04 сентября 2011

Я бы посоветовал вам взглянуть на NSNotificationCenter Какао и связанные с ним классы.У Apple есть руководство по этому вопросу здесь .

Это может работать примерно так.

В вашем слое HUD вы подписываетесь на уведомления с именем @"battleLayerStuff":

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(doThisWhenSomethingHappens:) 
                                             name:@"battleLayerStuff" 
                                           object:nil];

И в вашем боевом слое, когда что-то происходит, вы публикуете уведомление с тем же именем:

[[NSNotificationCenter defaultCenter] postNotificationName:@"battleLayerStuff" 
                                                        object:battleObject];

Часть объекта является необязательной, но может быть полезна, если вы хотите отправить больше информации, чем просто «что-то произошло».

Если вы хотите извлечь информацию из отправляемого объектаВы делаете это в методе doThisWhenSomethingHappens::

- (void)doThisWhenSomethingHappens:(NSNotification *)notification
{
     BattleObject *battleObject = (BattleObject *) notification.object;
     // Do stuff with object
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...