0

CCSpriteをサブクラス化して、それ自体へのタッチを検出しました。

touchBeganはタッチすると起動しますが、ログには、毎回異なるスプライトに触れているにもかかわらず、同じスプライトが常にタッチを処理していることが示されています。
(ポインタアドレスはすべてのタッチで同じです。)

さらなるログは、それが私がワールドレイヤーに追加した最後のスプライトであることを示しています。

最後に追加したスプライトがタッチイベントに単独で反応するのはなぜですか?

CCSpriteBatchNodeを使用しましたが、これは問題に関連していますか?

それとも、cocos2dがタッチイベントを配信する正しいオブジェクトを見つけるためのヒットテストを実行しないためですか?

4

3 に答える 3

1

cocos2d-xのソースコードを見てきました。

タッチイベントをタッチデリゲートに送信する前に、ヒットテストは行われません。
したがって、touchBeganで自分でヒットテストを実行する必要があります(少なくともtargetedDelegateタイプの場合)

于 2012-07-06T07:47:23.747 に答える
1

タッチの場所がスプライトの境界内にあるかどうかを確認する必要があります。

いくつかの奇妙な擬似コード

function touchBegan(UITouch touch, etc)
    CGPoint pos = get location of touch;
    if (CGRectContainsPoint(sprite.boundingBox, pos)) //I think that is the method you need. It's something like that.
        NSLog(@"Sprite was touched!");
        return YES;
于 2012-07-07T14:46:28.260 に答える
0

タッチデリゲートをオーバーライドします。

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    BOOL shouldClaimTouch = NO;

    CGRect myRect = CGRectMake(0, 0, self.contentSize.width, self.contentSize.height);

    CGPoint touchLocation = [self convertTouchToNodeSpace:touch];
    CGPoint absoluteTouch = CGPointMake(fabsf(touchLocation.x), fabsf(touchLocation.y));

    BOOL layerContainsPoint = CGRectContainsPoint(myRect, absoluteTouch);
    if( layerContainsPoint )
    {
        shouldClaimTouch = YES;
        NSLog(@"Sprite was touched!");
        [self fireEvent];
    }

    return shouldClaimTouch;
}
于 2014-09-25T10:35:40.917 に答える