0

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

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

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

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

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

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

4

3 回答 3

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 回答
1

我查看了 cocos2d-x 源代码。

在将触摸事件发送给触摸委托之前,它不会进行命中测试。
因此,您必须自己在 touchBegan 中执行命中测试。(至少对于 targetDelegate 类型)

于 2012-07-06T07:47:23.747 回答
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 回答