2012-07-06 116 views
0

我对CCSprite进行了分类,以检测对自身的触摸。在cocos2d中检测到精灵的触摸

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

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

为什么我添加的最后一个精灵对触摸事件本身作出了反应?

我使用了CCSpriteBatchNode,这是否与问题有关?

或者是因为cocos2d只是不执行命中测试找到正确的对象来提供触摸事件?

+0

显示你的代码,所以有些人可以帮你 – Ayaz 2012-07-06 09:31:16

回答

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; 
+0

这已被标记为正确的答案,但代码是不明确。 UITouch视图框架信息和sprite boundingBox信息不兼容。 – jowie 2014-09-25 09:15:00

1

我看了一下cocos2d-x的源代码。

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

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; 
}