在cocos2d中检测精灵的触摸

时间:2012-07-06 06:05:50

标签: cocos2d-iphone touch ccsprite

我将CCSprite子类化为检测自身的触摸。

touchBegan在触摸时触发,但是日志显示同一个精灵一直处理触摸,即使我每次都触摸不同的精灵。
(它的指针地址对于所有触摸都是相同的。)

进一步的日志显示它是我添加到世界图层的最后一个精灵。

为什么我添加的最后一个精灵会自动对触摸事件作出反应?

我使用过CCSpriteBatchNode,这会与问题有关吗?

或者是因为cocos2d没有执行命中测试来找到传递触摸事件的正确对象?

3 个答案:

答案 0 :(得分:1)

我查看过cocos2d-x源代码。

在将触摸事件发送给触摸代表之前,它没有进行测试 因此,你必须自己在touchBegan中执行命中测试。(至少对于targetedDelegate类型)

答案 1 :(得分: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;

答案 2 :(得分: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;
}