2014-02-13 42 views
3

我有這個對象,有一個從路徑創建的physicsBody。SpriteKit - physicsBody不尊重邊

整個場景區域(=整個屏幕)本身就是這個物體不應該逃離的邊界。作品幾乎如預期

這一幕的邊界由

self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]; 

一切定義。物體在邊緣碰撞並跳動,並且大部分時間受到它們的約束,但是如果你堅持多次,以高衝擊力將物體發射到邊緣,物體最終不會尊重邊緣並逃離,可能是什麼還有一個SpriteKit錯誤。

對象的類初始化是這樣的:

self.physicsBody.dynamic = YES; 

CGFloat offsetX = self.frame.size.width/2.0f; 
CGFloat offsetY = self.frame.size.height/2.0f; 

CGMutablePathRef path = CGPathCreateMutable(); 

CGPathMoveToPoint(path, NULL, 60 - offsetX, 79 - offsetY); 
CGPathAddLineToPoint(path, NULL, 96 - offsetX, 69 - offsetY); 
CGPathAddLineToPoint(path, NULL, 124 - offsetX, 44 - offsetY); 
CGPathAddLineToPoint(path, NULL, 120 - offsetX, 23 - offsetY); 
CGPathAddLineToPoint(path, NULL, 85 - offsetX, 0 - offsetY); 
CGPathAddLineToPoint(path, NULL, 62 - offsetX, 3 - offsetY); 
CGPathAddLineToPoint(path, NULL, 37 - offsetX, 19 - offsetY); 
CGPathAddLineToPoint(path, NULL, 12 - offsetX, 29 - offsetY); 
CGPathAddLineToPoint(path, NULL, 3 - offsetX, 39 - offsetY); 
CGPathAddLineToPoint(path, NULL, 7 - offsetX, 58 - offsetY); 
CGPathAddLineToPoint(path, NULL, 27 - offsetX, 46 - offsetY); 
CGPathAddLineToPoint(path, NULL, 36 - offsetX, 61 - offsetY); 

CGPathCloseSubpath(path); 

self.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:path]; 
self.physicsBody.restitution = 0.0f; 
self.physicsBody.usesPreciseCollisionDetection = YES; 

我能做些什麼措施來檢測並防止物體離開畫面?

謝謝。

+0

你已經能夠解決這個問題?我遇到了與圓體和邊緣類似的問題。一些嘗試使用強制之後,該對象逃離邊緣,永遠不能回到屏幕......不知道它是否真的是SpriteKit的錯誤。 – Khanh

+0

是的,但這並不適用於我的情況。我有圈子物理身體和問題仍然發生... – Khanh

+0

@Khanh SpriteKit是越野車作爲地獄。六個月前,我直接向蘋果公司提供了15個關於SpriteKit的bug報告,但蘋果公司並沒有給出解決方案。但是另一個物體的碰撞形狀呢? – SpaceDog

回答

4

我沒有跟蹤這些點,但它看起來像是有一個non-convex polygon或頂點不跟隨逆時針方向或兩者都有的點。確保形狀爲凸形,頂點順序(卷繞)按逆時針順序排列。

如果此形狀僅用於碰撞檢測的靜態(非移動)物體,則可以使用bodyWithEdgeLoopbodyWithEdgeChain,其中纏繞和凸形不重要。

PS:不要忘記釋放路徑:

CGPathRelease(path); 
+0

'bodyWithEdgeLoop'和'bodyWithEdgeChain'有什麼區別? – SpaceDog

+0

我用另一個2替換了bodyWithPolygonFromPath,對象停止移動。根本不受重力或力量的影響。 – SpaceDog

+0

就像我說的,如果主體是靜態的(不移動,不受重力或觸點的影響),您可以使用邊緣/鏈條方法,否則您必須確保多邊形設置正確,以便與body一起使用.WithPolygonFromPath – LearnCocos2D