0

プロトコルを実装するすべてのクラスが、トリガーされたプロトコル メソッドに基づいてアクションを実行するように変更されるように、デリゲートを実装する方法を理解するのに助けが必要です。

すべての入力を処理して状態を渡す InputHandler クラス (CCNode サブクラス) があります (例: FIRE、STOP、MOVE_LEFT、MOVE_RIGHT など)。この InputHandler クラスには、プレイヤーが触れる UI コントロールに基づいてトリガーされるいくつかのメソッドを持つ Protocol があります。

問題は、現在、このプロトコルを実装してカスタム アクションを実行する 2 つの GameObjs がありますが、一方の 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

私は自分の質問に対する答えを見つけました。私は Obj-C と Cocos2D/Box2D を学習している初心者 (3 ~ 4 か月) であり、C++/C# のバックグラウンドを持っているため、多くの経験豊富な Objective-C++ 開発者にとっては、これは一瞬のことのように思えます。

デリゲート パターンを使用して、トリガーに基づいてカスタム アクションを実行することに関心のあるクラスをトリガーしていました。デリゲート パターンは 1 対 1 の関係です。1 つのクラスがイベントをトリガーし、2 番目のクラスがトリガーに基づいてアクションを実行します。

Obj-C には、NSNotificationCenter というアプリケーション シングルトンがあります。これは、クラスがこのシングルトン インスタンスに通知を追加できるようにするローカル通知/メッセージング システムであり、そのカスタム アクションの実行に関心のある他のクラスは、通知に登録してカスタム アクションを実行できます。ステーションにラジオ チャンネルを追加するようなものだと考えてください。そのチャンネルを聞きたい人は、そのチャンネルの周波数にダイヤルするだけです。

また、@protocol を使用して、通知をリッスンしているすべてのクラスが一貫性のために同じ呼び出しのセットを持っていることを確認しました。例: onPress、OnMove、onRelease など。

于 2013-05-22T06:22:03.660 に答える