我對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