0

私はいくつかのレイヤーを持っていて、それらにいくつかのスプライトを追加しました。この方法でそれらにアクセスしようとしています:

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

    if(CGRectContainsPoint([[self getChildByTag:tagNumber] boundingBox], location)) {
        CCLOG(@"You've touched the sprite!");
    }
}

奇妙なことに、このメソッドがない場合は次のようになります。

-(BOOL) ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    return YES;
}

画面をタッチするとアプリがクラッシュしました。何か考えはありますか?

アップデート:

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

2 に答える 2

1

ccTouchBeganイベントを受信したがccTouchesBeganを受信しなかった場合(複数形に注意)、CCTargetedTouchDelegateプロトコルを使用しています。クラスをCCTouchDispatcheraddTargetedDelegateに登録している可能性があるため、メソッドがccTouchesXXXXではなくccTouchXXXXの単一バージョンであるCCTargetedTouchDelegateプロトコルの使用に固執する必要があります。

Xcodeが表示する警告にも注意する必要があります。ccTouchBeganを実装しないと、「セレクターに応答しない可能性があります」という警告が表示される可能性があります。すべての警告は深刻に受け止められる必要があります(実際、「すべての警告をエラーとして扱う」をオンにすることをお勧めします)。

于 2011-12-21T15:00:22.393 に答える
0

コンソールでエラーが発生しましたか?認識されないセレクターについて何か?私がcocos2Dに関わってからしばらく経ちましたが、2番目のメソッドが最初のメソッドをオーバーライドするかどうかを確認する必要があります。実際に存在する場合、それが存在しない場合、プログラムは最初のもの(voidを返すもの)を使用するため、コード実装の実際のバグに遭遇します。'-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event'の最初の行にブレークポイントを設定し、BOOLを返す関数を削除すると、次の場合に何が起こるかが段階的にわかります。デバッガーを使用します。

そして、コンソールログを投稿してください。「セレクターが見つかりません」、「子が見つかりません」、または「引数がnilであるため、引数が無効です」という問題が発生するはずです。

ちょっとした考え。

于 2011-12-21T13:16:34.400 に答える