我正在使用iPhone的Cocos2d游戏开发框架。
让我们专注于战斗场景:
战斗场景有儿童:战士层,HUD层,菜单层,背景层等......
有时,我的战士必须将我的HUD图层“联系”(如调用其中的函数)。
我发现这很难。基本上,我的战士层需要某种... HUD层的实例或引用才能调用其中的函数,对吧?但我不知道怎么做这件事。
目前,这就是我的工作:
战斗层将在场景(其父级)中运行一个函数,并且在这个函数中,我将“找到”HUD层子级,并调用我需要的函数。
现在,这有点不方便。在这种情况下你会做什么?
答案 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"]];