2012-09-08 43 views
9

我是Cocos2d的初學者。我有一個精靈,我想忽略該精靈的透明區域上的觸摸。檢測cocos2d中sprite的透明部分?

我意識到這個問題Cocos2d 2.0 - Ignoring touches to transparent areas of layers/sprites,也是這篇了不起的文章http://www.learn-cocos2d.com/2011/12/fast-pixelperfect-collision-detection-cocos2d-code-1of2/

我能夠使它與KKPixelMaskSprite一起使用,但只能在文件中使用精靈時使用,而不能在批處理節點中使用精靈。每當我使用批處理節點(Sprite表)時,爲了得到精靈,它停止工作。

我對彼此有不同的精靈,我想用這種方式檢測 - >如果觸摸是在當前的精靈邊界框中,那部分在精靈上是透明還是不是?

P.S.I'm using cocos2d 1.0。我現在不想使用任何物理引擎,我只是想忽略sprite透明區域(使用批處理節點創建的)的接觸。我該怎麼做?或者可能有任何工具可以幫助嗎?

非常感謝。

+0

難道ü嘗試CGPathRef? – Guru

+0

我認爲你提到的鏈接是完美的解決方案.. http://stackoverflow.com/questions/10889170/cocos2d-2-0-ignoring-touches-to-transparent-areas-of-layers-sprites – user739711

+0

@ user739711我試過了,它只適用於單個Sprites,而不是Batch節點。 – User1234

回答

3

可以使用CGMutablePathRef使非矩形子畫面的碰撞檢測。

//檢查

CGPoint loc =[mySprite convertToNodeSpace:touchPoint]; 

    if([mySprite isPointInsideMap:loc]) 
    { 
     //touched inside.. 
    } 

//Add this method in your MySprite class derived from CCSprite. 
-(bool)isPointInsideMap:(CGPoint)inPoint 
{ 
    if (CGPathContainsPoint(mCollisionPath, NULL, inPoint, NO)) 
    { 
     return true; 
    } 

    return false; 
} 

////創建路徑

CGMutablePathRef mCollisionPath = CGPathCreateMutable(); 
CGPathMoveToPoint(mCollisionPath, NULL, 0, 0); 
CGPathAddLineToPoint(mCollisionPath, NULL, 11, 82); 
CGPathAddLineToPoint(mCollisionPath, NULL, 42, 152); 
CGPathAddLineToPoint(mCollisionPath, NULL, 86, 202); 
CGPathAddLineToPoint(mCollisionPath, NULL, 169, 13); 
CGPathCloseSubpath(mCollisionPath); 
+1

謝謝,這個解決方案爲我工作。 – User1234

+0

@ User1234 :(:(:( – Guru

+0

它有什麼問題? – User1234

1

我會努力改變boundingBox的在你的觸摸我,並減少它的不同的精靈......

+0

謝謝,我現在正在使用的是,我爲每個精靈調整了BoundingBox。糟糕的是,它可能只是矩形。無論謝謝你的回答,+1 upvote。 – User1234

2

這個答案比你想象的更加分散,因爲我不會給你一個代碼例如,但這是我如何實現這個:

你有精靈的邊界框(精靈的角落,包括透明區域,如果適用的話)的位置,以及觸摸屏幕上的位置。使用這些信息,您可以計算出精靈的中的位置。換句話說,您可以找到所觸摸的像素,與遊戲屏幕無關。

現在您已經獲得了像素位置(x和y),打開圖像(可能是PNG),並獲取該像素的RGB [A]值。每個PNG都有一個透明鍵。這是alpha通道如果PNG的內部像素顏色在(x; y)==透明鍵那麼該像素是透明的

如果您可以獲取有問題的像素的alpha值,等於0,那麼像素是透明的。

編輯:語義(「alpha通道」)

+0

我已經嘗試瞭解決方案,它在我的問題中已鏈接,但無法使其適用於批量節點。謝謝。 – User1234