我将 CCSprite 子类化以检测对自身的触摸。
touchBegan 在触摸时触发,但日志显示相同的精灵一直在处理触摸,即使我每次都在触摸不同的精灵。
(所有触摸的指针地址都是相同的。)
进一步的日志显示它是我添加到世界层的最后一个精灵。
为什么我添加的最后一个精灵会自行对触摸事件做出反应?
我使用了CCSpriteBatchNode,这会与问题有关吗?
或者是因为 cocos2d 只是没有执行命中测试来找到正确的对象来传递触摸事件?
我将 CCSprite 子类化以检测对自身的触摸。
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;
我查看了 cocos2d-x 源代码。
在将触摸事件发送给触摸委托之前,它不会进行命中测试。
因此,您必须自己在 touchBegan 中执行命中测试。(至少对于 targetDelegate 类型)
覆盖触摸委托:
- (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;
}