1

self.isTouchEnabled = YES; もちろん、initメソッドで。

-(void) ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];
}

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint location = [touch locationInView:[touch view]];
    location = [[CCDirector sharedDirector] convertToGL:location];

}

上記のコードでは、ccTouchesMovedは正常に機能しますが、ccTouchMovedは呼び出しません。

4

2 に答える 2

3

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つの重要な違いに注意してください。

  1. これらのメソッドは、それらのセットではなく、シングルタッチのみを提供します。そのため、メソッド名は「ccTouches」ではなく「ccTouch」で始まります。

  2. ccTouchBeganメソッドは必須であり、ブール値を返します。

したがって、ccTouchBeganは、使用可能なタッチごとに個別に呼び出され、YESを返すと、気になるタッチを示します。その後、ccTouchBeganによって要求されたタッチのみが、移動、終了、およびキャンセルされたイベントに渡されます(これらはすべてオプションです)。

これらのイベントを受信するには、ターゲットのタッチデリゲートとしてグローバルディスパッチャに登録する必要があります。CCLayerサブクラスで、registerWithTouchDispatcherを次のようにオーバーライドします。

-(void)registerWithTouchDispatcher {
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:YES]; }

(これは、ファイルの先頭にある「CCTouchDispatcher.h」をインポートすることを意味します)。

どちらを使用しますか?

より複雑な登録は別として、NSSetを自分で分割する必要がなく、イベントがMovedで必要なものであるかどうかを確認し続ける必要がないため、ターゲットタッチデリゲートは一般的に使いやすいです。 /終了/キャンセルされたイベント。ただし、1つの方法で複数のタッチを処理する場合(たとえば、それらを組み合わせてズームまたは回転入力にするため)、代わりに標準のタッチデリゲートを使用することをお勧めします。 どちらか一方しか使用できないことに注意してください。

于 2013-03-26T08:20:02.680 に答える
0

2つの動作があります。1つは標準タッチ用、もう1つは複数タッチ用です。する必要はありません。プロパティを好きな値にaddTargetedDelegate:::設定するだけです。touchModeが登録を担当しますCCLayer

- (void)onEnter
{
    [self setTouchMode: kCCTouchesAllAtOnce]; //resp kCCTouchesOneByOne
}

舞台裏では、を変更するtouchModeとタッチが無効になってから再度有効になり、タッチ()を有効にすると、またはenableTouchを呼び出して適切なデリゲートが登録されます。addStandardDelegateaddTargetedDelegate

于 2013-03-26T08:57:46.740 に答える