我对CCSprite进行了分类,以检测对自身的触摸。在cocos2d中检测到精灵的触摸
touchBegan在触摸时触发,但日志显示相同的精灵始终处理触摸,即使我每次触摸不同的精灵。
(它的指针地址与所有触摸相同)
进一步的日志显示它是我添加到世界层的最后一个精灵。
为什么我添加的最后一个精灵对触摸事件本身作出了反应?
我使用了CCSpriteBatchNode,这是否与问题有关?
或者是因为cocos2d只是不执行命中测试找到正确的对象来提供触摸事件?
我对CCSprite进行了分类,以检测对自身的触摸。在cocos2d中检测到精灵的触摸
touchBegan在触摸时触发,但日志显示相同的精灵始终处理触摸,即使我每次触摸不同的精灵。
(它的指针地址与所有触摸相同)
进一步的日志显示它是我添加到世界层的最后一个精灵。
为什么我添加的最后一个精灵对触摸事件本身作出了反应?
我使用了CCSpriteBatchNode,这是否与问题有关?
或者是因为cocos2d只是不执行命中测试找到正确的对象来提供触摸事件?
您需要检查触摸的位置是否在精灵范围内。
一些奇怪的伪
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;
这已被标记为正确的答案,但代码是不明确。 UITouch视图框架信息和sprite boundingBox信息不兼容。 – jowie 2014-09-25 09:15:00
我看了一下cocos2d-x的源代码。
在将touch事件发送给touch-delegate之前,它不会进行命中测试。
因此,您必须在touchBegan中自己执行命中测试(至少对于targetedDelegate类型)
覆盖触摸代表:
- (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;
}
显示你的代码,所以有些人可以帮你 – Ayaz 2012-07-06 09:31:16