0

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

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

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

如果我评论第 2 类'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
4

2 回答 2

0

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

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

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

于 2013-05-20T08:23:10.430 回答
0

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

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

在 Obj-C 中,有一个名为 NSNotificationCenter 的应用程序单例。这是一个本地通知/消息系统,它允许一个类向这个单例实例添加一个通知,其他有兴趣执行其自定义操作的类可以注册到通知并执行他们的自定义操作。可以将其想象为向电台添加广播频道。任何想收听该频道的人,只需拨入该频道频率即可。

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

于 2013-05-22T06:22:03.660 回答