2016-06-17 11 views
0

私のゲームでは、私はSKSpriteを使用します。いくつかの衝突は検出されません。私は10回試しましたが、衝突はうまくいきましたが、検出されるはずの衝突の約25%が検出されませんでした。なぜ私は多くのことを試みたのか分かりません。衝突は、同じカテゴリのノードでのみ発生します。スウィフト - ランダムな衝突が検出されない

なぜ私は明らかにそれらを見ることができるときにいくつかの衝突が作られていないということは考えられません。ご協力いただきありがとうございます。ここで

はdidBeginContactのコードです:ここで

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody = contact.bodyA 
    var secondBody: SKPhysicsBody = contact.bodyB 

    if firstBody.categoryBitMask == secondBody.categoryBitMask { 

      listContacts.append([firstBody.node!,secondBody.node!]) 
     } 

    } 
} 

はdidEndContactのコードです:

rectangle.physicsBody = SKPhysicsBody(rectangleOfSize: rectangle.size) 
rectangle.physicsBody?.dynamic = true 
rectangle.physicsBody?.collisionBitMask = PhysicsCategory.None 

:私は新しいSKSpriteNodeを宣言するときに

func didEndContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody = contact.bodyA 
    var secondBody: SKPhysicsBody = contact.bodyB 

    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask { 

     for i in listContacts{ 

      if (i.contains(firstBody.node!) && i.contains(secondBody.node!)){ 

       let findIndex = listContacts.indexOf { $0 == i } 
       listContacts.removeFirst(findIndex!) 
      } 
     } 

    } 

は最後に、私はこれを設定しましたusesPreciseCollisionDetection = trueは何も変更しないのでusePrecisionCollisionDetectionは使用しません。

すべてのSKSpriteNodeは、同じSKSpriteNodesだけが衝突するため、カテゴリBitmaskとcontactTestBitmaskが等しいものとします。

また:あなたは何が起こるかを簡単に理解したい場合は最後にここに

physicsWorld.gravity = CGVectorMake(0, 0) 
physicsWorld.contactDelegate = self 

は(衝突の問題は、長方形の間にある)私のゲームの短いビデオですhttps://www.youtube.com/watch?v=-pbmKwQiE9U

+0

タッチ機能を投稿できますか?ビデオをタップしてブロックを削除したようですが、正しいですか? – Siriss

+0

@Sirissあなたは正しいですが、巨大な機能であり、多くのテストを行いました。なぜなら、listContactsには接続がないため、衝突検出が原因であることが分かります。基本的にtouch関数は、listContactsを使ってどの矩形が隣り合っているかをチェックします。そして、同じ色の隣に最小3がある場合、それらは消えます。 – Oscar

答えて

0

私はそれを修正しました。その理由は、関数 "touchesEnded"では、listContactsの不正な接続を削除する再帰的な関数がありました!

+0

うれしいことにそれを解決しました。 – Siriss

0

あなたはかどうかをチェックしているように見えますノードが同じ持つノードにヒットした場合、本体のAのcategoryBitMaskは、これが唯一のアクションを実行します

if firstBody.categoryBitMask == secondBody.categoryBitMask { 

     listContacts.append([firstBody.node!,secondBody.node!]) 
    } 

} 

ボディBに等しいです

collisionBitMasksをチェックして衝突がないかどうかを確認するか、名前を確認する必要があります。あなたはこのような何かを行うことができますcategoryBitMaskを使用して例えば

func didBeginContact(contact: SKPhysicsContact) { 

    var sprite: SKSpriteNode! 

    if contact.bodyA.categoryBitMask == <your category bitmask> { 
     sprite = contact.bodyA.node! as! SKSpriteNode 
    } 
    else if contact.bodyB.categoryBitMask == <your category bitmask> { 
     sprite = contact.bodyB.node! as! SKSpriteNode 
    } 

    // Do something with sprite.... 
    // You can also create another sprite, and assign it to the other body, and perform functions on it, or both A and B. 
    // It is good to have different functions you send can send the nodes to once you find out which ones they are. 

} 

あなたはスプライトがお互いをヒットしているかを確認するためにこれらのチェックを行うことができます。

+0

あなたの答えをありがとう、私はそれを試してみて、あなたのコードに似て、それは何も変わらない、同じ問題がまだあります。私は同じカテゴリのノードの衝突を検出する必要があるので、まったく同じことです。 – Oscar

+0

ゲームの様子を見たい場合は、私の投稿にビデオを追加しました。 – Oscar

関連する問題