2015-12-22 34 views
0

所以我有一個槳/酒吧,當酒吧碰到一個球時,它會縮小。我也想更新槳/條的SKPhysicsBody,以便它保持與視覺精靈一樣的碰撞盒。我該如何做到這一點?更新SKPhysicsBody rectangleOfSize

這裏是我當前的代碼,位於一個didBeginContact碰撞功能如預期

bar.size = CGSizeMake(16 * playerLife, 16) 
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64)) 

的bar.size作品裏面。 physicsBody rectangleOfSize使遊戲崩潰。

更新:響應包含更多的代碼來評論

bar.size = CGSizeMake(16 * playerLife, 16) 
bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64)) 


func CollisionWithDeathBar(ball: SKSpriteNode, deathBar: SKSpriteNode) { 
    playerLife-- 
    bar.size = CGSizeMake(16 * playerLife, 16) 
    shouldResizePaddle = true 
} 

override func didSimulatePhysics() { 
    if shouldResizePaddle { 
     bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64)) 
     shouldResizePaddle = false 
    } 
} 

回答

2

一個物理接觸回調過程中修改物理機構是不允許的。 (想想吧,在更新物理模擬的過程中,SpriteKit必須檢查世界上所有的物理實體,找到碰撞,併爲它們中的每一個調用聯繫處理程序,如果你可以改變它們中的物體所有這一切,你會有未定義的,或至少不明確的結果。)

我建議使用接觸函數來安排物理體更改發生在稍後。這樣的事情:

var shouldResizePaddle = false 

func didBeginContact(_ contact: SKPhysicsContact) { 
    if /* paddle/ball contact */ { 
     shouldResizePaddle = true 
    } 
} 

override func didSimulatePhysics() { 
    if shouldResizePaddle { 
     bar.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: 16 * playerLife, height: 64)) 
     shouldResizePaddle = false 
    } 
} 
+0

我更新了我的文章,以包括更多的代碼。我試過你的例子,我得到一個奇怪的問題。槳/條(碰撞時)跳下約32個像素。並允許所有的球穿過它。看起來SKPhysicsBody簡直就消失了。它也崩潰(有時)「致命錯誤:在解包可選值時意外發現零」 – Glutch

+1

無法從您發佈的代碼中診斷出所有這些問題。然而,至少有一些是清楚的:如果你重新創建一個物理體,你需要重新設置與它相關的所有屬性(如碰撞掩碼)。 – rickster

+0

這正是缺少的,謝謝!我沒有意識到它被重新創建。我認爲它只是改變了這個值,類似於更新變量。謝謝。 – Glutch