2012-09-21 103 views
1

我在寫一個cocos2d-x應用程序。我有一個小精靈在上面有一個小精靈。這些精靈代表屏幕上的一個邏輯對象,它被轉換爲整個對象。現在,當物體被觸摸時,我需要發現哪些小精靈被觸摸。如何檢測兒童精靈的觸摸

問題在於,雖然父Sprite以當前的方式給我提供了所有信息(包圍盒,縮放,旋轉等),但子精靈始終保留其原始數字,儘管與父母一起轉換,我無法弄清楚爲兒童計算「真實」維度的正確方法。

,因爲它看起來對我來說,有兩個事實使所有的困難:

  1. 孩子邊框具有其相對於父初始邊框報道其初始尺寸。
  2. 我無法計算父母的旋轉後的初始邊界框(參見下圖),因此我無法計算出現在父母精靈的左下角,我需要它作爲子變換的關係點。

下面是這種情況的繪圖:

Sprite bounding box after rotation

因此,要總結,以檢查觸摸是否打孩子的精靈,我需要計算的當前邊框孩子,根據父母的轉變。我可以計算孩子的縮放比例和旋轉角度,但我不知道它應該相對於父對象的位置,因爲父對象的邊界框與開始時的邊界框非常不同。添加奇怪的錨點到故事中,它變得更加複雜。完美的解決方案是獲取原始精靈的頂點而不是邊界框。可能嗎?

任何想法?我錯過了什麼嗎?

回答

0

假設你有一個父

CCSprite* parent; 

和一個孩子,

CCSprite* child; //child Tag is 100 

你可以把它在你的觸控方法的嘗試:boundingBox的的

YOUR_CLASS::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent){ 
    CCPoint touchLocation = parent->convertTouchToNodeSpace(pTouch); 
    if (CCRect::CCRectContainsPoint(parent->getChildByTag(100)->boundingBox(),touchLocation)){ 
     //do something 
     CCLOG("touch on child"); 
    } 
} 
+0

從我所看到的,孩子邊框,我得到的是不是真正的邊框,但原來的一個,在所有轉換之前。 – FireAphis

+0

@FireAphis這很奇怪。在我的應用程序中,我有一個鐘錶,這是鐘面的一個孩子,鐘錶的旋轉和定位點都改變了,但我沒有任何使用上述代碼檢測觸摸的問題。您可以查看https://play.google.com/store/apps/details?id=com.giggleup.ITTAFree –

1

的源代碼()也許有幫助。您可以通過nodeToParentTransform()獲取affinetransform,並使用CCPointApplyAffineTransform獲取四個點的新位置。然後,您可以編寫一種新方法來檢查觸摸是否位於新矩形中。

0

如果有人想找出邊界框的字母在旋轉標籤:

int maxIdx = label->getStringLength() -1; 
Mat4 trans = label->getNodeToParentTransform(); 
for(int idx = 0; idx<=maxIdx; idx++) { 
    Sprite* letter = label->getLetter(idx); 
    Rect letterRect = letter->getBoundingBox(); 
    Point p = PointApplyTransform(letterRect.origin, trans); 
    Rect rect = Rect(p.x, p.y, 10, 10); // Letter Approximation rect 
}