Cocos2dは、タッチイベントを処理する2つの異なる方法をサポートしています。これらは、2つの異なるタイプのデリゲートによって定義されます(どちらもCCTouchDelegateProtocol.hで定義されています)。
標準タッチデリゲート:
@optional
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)ccTouchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
これらは、標準のCocoaTouchアプリで発生するのと同じ種類のイベントです。すべてのイベントとすべてのタッチを取得します。マルチタッチ環境で気になるタッチを分類するのはあなた次第です。CCLayerサブクラスでこれらのイベントを取得するには、次のようにisTouchEnabled=YESを設定するだけです。
self.isTouchEnabled = YES;
ターゲットタッチデリゲート
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event;
@optional
- (void)ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event;
- (void)ccTouchCancelled:(UITouch *)touch withEvent:(UIEvent *)event;
ターゲットと標準のタッチデリゲートの2つの重要な違いに注意してください。
これらのメソッドは、それらのセットではなく、シングルタッチのみを提供します。そのため、メソッド名は「ccTouches」ではなく「ccTouch」で始まります。
ccTouchBeganメソッドは必須であり、ブール値を返します。
したがって、ccTouchBeganは、使用可能なタッチごとに個別に呼び出され、YESを返すと、気になるタッチを示します。その後、ccTouchBeganによって要求されたタッチのみが、移動、終了、およびキャンセルされたイベントに渡されます(これらはすべてオプションです)。
これらのイベントを受信するには、ターゲットのタッチデリゲートとしてグローバルディスパッチャに登録する必要があります。CCLayerサブクラスで、registerWithTouchDispatcherを次のようにオーバーライドします。
-(void)registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; }
(これは、ファイルの先頭にある「CCTouchDispatcher.h」をインポートすることを意味します)。
どちらを使用しますか?
より複雑な登録は別として、NSSetを自分で分割する必要がなく、イベントがMovedで必要なものであるかどうかを確認し続ける必要がないため、ターゲットタッチデリゲートは一般的に使いやすいです。 /終了/キャンセルされたイベント。ただし、1つの方法で複数のタッチを処理する場合(たとえば、それらを組み合わせてズームまたは回転入力にするため)、代わりに標準のタッチデリゲートを使用することをお勧めします。
どちらか一方しか使用できないことに注意してください。