0

我正在尝试解决一个架构问题,但我想找到最合适的方法。

我有游戏场景 GameLayer.h,这是我在这种情况下的看法。我也有我试图成为控制器的 GameEngine 类。我有从 CCNode 派生的自定义 Egg 类,以及通过 Egg 类中的调度实现的一些计时器逻辑。我通过 addChild 方法在游戏场景中添加了许多 Egg 对象。所以GameEngine.m导入GameLayer.h,GameLayer.m导入Egg.h

在每个 Egg 中的计时器用完后,我想收到通知,即执行一些操作、增加分数等。问题是实现这种情况的最佳方法是什么。我也想遵守 MVC 规则我想到的快速解决方案是

  1. 在 Egg 类中包含 Gamelayer.h 并在其中调用一些更新方法。更新视图(自我)并通知 GameEngine 保存新分数。
  2. 在 Egg 类中包含 Gamelayer.h 并在其中调用一些更新方法。在更新方法中调用另一个更新方法,该方法现在在 GameEngine.h 中,现在来自 GameEngine 保存分数,并更新 Gamelayer(视图)
  3. 实施 KVO。问题是我以前从未做过,我不知道观察者应该是 GameLayer 还是 GameEngine

请帮助,任何例子表示赞赏

4

1 回答 1

1

更多选择:

1.使用NSNotificationCenter。您的 Eggs 会发布通知,而您的 GameLayer 会观察。

2. 使用协议。例子:

// in Egg.h

@class Egg;
@protocol EggDelegate
// an example method
-(void)egg:(Egg *)egg hadSomethingHappen:(int)parameter;
@end

@interface Egg: CCNode
@property (weak) id<EggDelegate> delegate;
@end

// in Egg.m
/// something happened and delegate has to be notified?
[self.delegate egg:self hadSomethingHappen:someNumber];

然后声明 GameLayer 来支持这个协议:

@interface GameLayer : CCLayer <EggDelegate>

在 GameLayer 中实现协议的方法并使其成为 Egg 对象的委托:

// somewhere in GameLayer
Egg *egg = [Egg node];
egg.delegate = self;

...

//protocol implementation
-(void)egg:(Egg *)egg hadSomethingHappen:(int)parameter
{
// do something
}
于 2013-04-25T20:05:23.610 回答