2017-12-21 24 views
1

私のアプリでは、ノードの物理的ボディをプログラムで作成したいと思っています。しかし、物理的なボディをプログラムで作成すると、SpriteKitエディタで作成された物理ボディが機能しますが、動作しないようです。物理学者がプログラムによって作成されると、エディタで作成されたときに他のノードと衝突しません。SKPhysicsBodyの奇妙な振る舞い

physicsBody = SKPhysicsBody(rectangleOf: size) 

    if let body = self.physicsBody{ 
     body.isDynamic = true 
     body.affectedByGravity = false 
     body.allowsRotation = false 
     body.categoryBitMask = CollisionCategoryBitmask.shootWall.rawValue 
     body.collisionBitMask = CollisionCategoryBitmask.circle.rawValue 
     body.contactTestBitMask = CollisionCategoryBitmask.circle.rawValue 
    } 

サイズは、ノードのサイズプロパティです:

は、ここに私のコードです。

フィジックスボディがノードに割り当てられている最初の行をコメントにして、代わりにSpriteKitシーンエディタでフィジックスボディを設定すると機能します。どちらの場合でも、if条件内のコードが実行されていることに注意してください。

enter image description here

更新:面白いです何

は、私がこれを行うときということです:

それはその基本的に何も変えていないので、何の影響も与えてはならない
physicsBody = SKPhysicsBody(bodies: [physicsBody!]) 

、それは同様に動作しません。これはSpriteKitのバグですか?あなたはこの

required init?(coder aDecoder: NSCoder) { 
    factor = 0.5 
    super.init(coder: aDecoder) 
    self.pBody() 

} 

を行うと

+0

を使用してこれを行うことができリセットすることによって、あなたは再びケースではありませんnilにそのように設定することを意味している場合、私はあなたには、いくつかの方法 – Knight0fDragon

+0

で体をリセットしている感覚を持っています。シーンupstateメソッドでブレークポイントを設定し、物理ボディの値をチェックしました。これはゼロではありません。 – Lenny1357

+0

いいえあなたが作成したものではなく、新しい一般的な物理学体を適用しています – Knight0fDragon

答えて

3

physicsWorldはまだ存在していないので、体が世界に置かれません。

作成後に実行したいので、セットアップが完了した後で起動するためにコードをクロージャにスローします。あなたがあなたのコードを拡張する必要がDispatchQueue

required init?(coder aDecoder: NSCoder) { 
    factor = 0.5 
    super.init(coder: aDecoder) 
    DispatchQueue.main.async { 
     self.pBody() //This will fire after the SKS finished building the scene, so physicsWorld will exist 
    } 
} 
+0

ありがとうございました!しかし、セットアップが完了した後にクロージャが実行される理由を素早く説明できますか? – Lenny1357

+3

メインスレッドでは、新しいタスクに切り替える前に現在のプロセスを完了する必要があるため、DispatchQueueは、現在のプロセスが完了したときに取得する新しいタスクのキューにDispatchQueueをスローします。基本的にあなたは洗車をしています。誰かが新しい皿を皿の中に入れて洗ってください。あなたが洗っている現在の皿を仕上げたら、掃除が必要な次の皿をつかむことができます。 – Knight0fDragon