2012-07-06 117 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; 
}