2014-07-17 48 views
0

我試圖創建一個簡單的輔助方法來檢測UITouch是否是CCSprite的範圍內用這種方法:如果touch在CCSprite範圍內? cocos2d的V3

- (BOOL)containsTouchLocation:(UITouch *)touch { 
    CGPoint p = [self convertToNodeSpace:touch.locationInWorld]; 
    CGRect r = self.boundingBox; 
    return CGRectContainsPoint(r, p); 
} 

這似乎像它應該回想起來工作,但它只是返回「NO」,甚至儘管觸摸很明顯在屏幕上的精靈中。有什麼我在這裏做錯了嗎?我正在使用Cocos2d v3。

回答

0

你在做什麼錯是boundingBoxframe的模擬,而不是bounds。因此,r位於節點的parent的座標空間中,而在節點本身的座標空間中爲p

如果您知道節點有一個家長,你可以在父母計算p座標空間:

CGPoint p = [self.parent convertToNodeSpace:touch.locationInWorld]; 
// You can also use a shorthand [touch locationInNode: self.parent]; 

或者相反,你可以得到rbounds RECT而不是frame

// notice that it is `contentSizeInPoints` and not `contentSize` 
CGRect r = { .origin = CGPointZero, .size = self.contentSizeInPoints }; 

但是無論哪種方式,CCNode現在也有hitAreaExpansion,您可能需要考慮:

r = CGRectInset(r, -self.hitAreaExpansion); 

,而不是做這一切,你可以使用hitTestWithWorldPos:方法,默認實現它的測試給世界位置是否是節點+/- hitAreaExpansion的範圍內還是。