Objective-C游戏开发:组件之间的通信

时间:2011-09-03 21:32:20

标签: objective-c cocos2d-iphone

我正在使用iPhone的Cocos2d游戏开发框架。

让我们专注于战斗场景:

战斗场景有儿童:战士层,HUD层,菜单层,背景层等......

有时,我的战士必须将我的HUD图层“联系”(如调用其中的函数)。

我发现这很难。基本上,我的战士层需要某种... HUD层的实例或引用才能调用其中的函数,对吧?但我不知道怎么做这件事。

目前,这就是我的工作:

战斗层将在场景(其父级)中运行一个函数,并且在这个函数中,我将“找到”HUD层子级,并调用我需要的函数。

现在,这有点不方便。在这种情况下你会做什么?

3 个答案:

答案 0 :(得分:3)

听起来你可能已经过度设计了这个。我可能做的是这样的事情。

我有一个IScene。我的每个场景类都实现了这个IScene。 IScene有一个名为“HUD”的属性,另一个名为“Menu”等。

当前的IScene被设置为全局静态实例:: CurrentScene

当前场景需要联系菜单时,我说::: CurrentScene-> Menu-> SomeFuncion()。

这会对你有用吗?

答案 1 :(得分:2)

我建议你看一下Cocoa的NSNotificationCenter及相关课程。 Apple有一个主题指南here

它可能会像这样工作。

在您的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
}

答案 2 :(得分:2)

您可以使用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"]];