我将CCSprite子类化为检测自身的触摸。
touchBegan在触摸时触发,但是日志显示同一个精灵一直处理触摸,即使我每次都触摸不同的精灵。
(它的指针地址对于所有触摸都是相同的。)
进一步的日志显示它是我添加到世界图层的最后一个精灵。
为什么我添加的最后一个精灵会自动对触摸事件作出反应?
我使用过CCSpriteBatchNode,这会与问题有关吗?
或者是因为cocos2d没有执行命中测试来找到传递触摸事件的正确对象?
答案 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;
}