委托只触发一个类,而不是其他实现相同协议的类

时间:2013-05-20 05:18:03

标签: cocos2d-iphone delegates

我需要一些帮助来理解如何实现委托,以便所有实现协议的类都会根据被触发的协议方法进行更改以执行其操作。

我有一个InputHandler类(CCNode子类)负责所有输入并传递状态(例如:FIRE,STOP,MOVE_LEFT,MOVE_RIGHT等)。这个InputHandler类有一个Protocol,它有一些基于玩家触摸的UI控件触发的方法。

问题是,现在我有两个实现此协议并执行其自定义操作的GameObj,但只有一个GameObject触发其操作,而另一个GameObj类没有执行其操作。

如果我评论第二类'controller.delegate = secondGameObj;第一个gameObj执行动作,就像委托触发协议方法时那样。

//InputHandler Class
@protocol InputHandlerDelegate <NSObject>
@optional
- (void)onPress;
- (void)onMove: (ControllerAction)state_;
- (void)onRelease;
@end

@class InputHandler: CCNode<CCTouchOneByOneDelegate>
@property (assign, nonatomic) id<InputHandlerDelegate> delegate;
//.....more InputHandler class details...
@end

//Implementation of game objects and assigning(registering) to the controller's delegate
InputHandler *controller = [InputHandler node];
[self addChild: controller];    

GameObject1 *gameObj1 = [GameObject1 node];
[self addChild: gameObj1];
controller.delegate = gameObj1; //does not trigger, unless I comment out gameObj2

GameObject2 *gameObj2 = [GameObject2 node];
[self addChild: gameObj2];
controller.delegate = gameObj2; //this game obj triggers protocol custom methods

2 个答案:

答案 0 :(得分:0)

您的委托属性自然会存储对单个对象的引用。分配第二个代理时,它将替换第一个代理。如果你有一个int变量X并为它赋值10后跟5,那么它的值将是5,而不是10 5。

要允许多个委托,请使用addDelegate和removeDelegate方法将它们添加到数组中。发送委托消息枚举数组并将消息发送到每个对象。例如,参见cocos2d的CCTouchDispatcher。

或者至少你需要两个单独的委托属性。

答案 1 :(得分:0)

我找到了问题的答案。我是一个新手(3-4个月)学习Obj-C和Cocos2D / Box2D,来自C ++ / C#背景,所以对于许多经验丰富的Objective-C ++开发人员来说这似乎是一个多哈时刻。

我使用Delegate Pattern来触发有兴趣根据触发器执行自定义操作的类。委托模式是一对一的关系。一个类触发事件,第二个类根据触发器执行操作。

在Obj-C中,有一个名为NSNotificationCenter的应用程序单例。这是一个本地通知/消息传递系统,允许类向此单例实例添加通知,而对执行其自定义操作感兴趣的其他类可以注册通知并执行其自定义操作。更像是向电台添加无线电频道。任何想要收听该频道的人,只需拨打该频道即可。

我还使用了@protocol来确保所有收听通知的类都具有相同的一致性调用。例如:onPress,OnMove,onRelease等。