2016-04-26 13 views
1

ゲームでは、ゲームが始まるといくつかのノードが既に接触していますが、これらの接触を検出する方法は見つかりません。私は、ノードが動いているときに起こる接触を検出し、関数didBeginContactを使用してゲーム中に接触することに成功します。SpriteKit/Swift - 2つのノードが既に接触しているときの接触を確認する方法

誰でもこれらの連絡先を検出する方法を教えてください。必要であれば、ここで

は私didBeginContactです:

func didBeginContact(contact: SKPhysicsContact) { 

    var firstBody: SKPhysicsBody 
    var secondBody: SKPhysicsBody 
    if contact.bodyA.categoryBitMask == contact.bodyB.categoryBitMask { 
     firstBody = contact.bodyA 
     secondBody = contact.bodyB 

     contactsList.append([firstBody.node!,secondBody.node!]) 
    } 
} 
+0

良い質問ですが、私はゲームタッチを開始するスプライトノードがdidBeginContactと動作しないと思います。私はあなたの唯一の他の選択肢はdidEndContactだと思うが、それはあなたが望むものではないようだ。 – Steve

+0

didBeginContactがすでに2つのボディに接触しているかどうかテストしましたか?論理的には、シーンの最初の通過中に、物理エンジンが2つの物理ボディをオーバーラップしていると判断した場合、didBeginContactが呼び出されます。その後、これらのボディをリストに追加し、まだタッチしている場合は次のパスでdidBeginContactを呼び出しませんが、もはやタッチしてリストから削除しないとdidEndContactを呼び出します。 –

+0

あなたの答えをありがとう、残念ながらdidBeginContactは呼ばれません。私はあなたが言ったのと同じようにしました! – Oscar

答えて

1

私はちょうど2つのスプライトは非常に最初からオーバーラップし、接触が私のために検出されていることを確認しようとしました。適切に特定の物体間の接触を検出するために、

import SpriteKit 

struct Collider { 
    static let SmallSquare  : UInt32 = 1 << 0 
    static let BigSquare  : UInt32 = 1 << 1 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    override func didMoveToView(view: SKView) { 

     self.physicsWorld.contactDelegate = self 

     let smallSquare = SKSpriteNode(color: .orangeColor(), size: CGSize(width: 50, height:50)) 
     smallSquare.zPosition = 2 
     smallSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     smallSquare.physicsBody = SKPhysicsBody(rectangleOfSize: smallSquare.size) 
     smallSquare.physicsBody?.affectedByGravity = false 
     smallSquare.physicsBody?.categoryBitMask = Collider.SmallSquare 
     smallSquare.physicsBody?.contactTestBitMask = Collider.BigSquare 
     smallSquare.physicsBody?.collisionBitMask = 0 
     addChild(smallSquare) 

     let bigSquare = SKSpriteNode(color: .purpleColor(), size: CGSize(width: 200, height: 200)) 
     bigSquare.zPosition = 1 
     bigSquare.position = CGPoint(x: frame.midX, y: frame.midY) 
     bigSquare.physicsBody = SKPhysicsBody(rectangleOfSize: bigSquare.size) 
     bigSquare.physicsBody?.affectedByGravity = false 
     bigSquare.physicsBody?.categoryBitMask = Collider.BigSquare 
     bigSquare.physicsBody?.contactTestBitMask = Collider.SmallSquare 
     bigSquare.physicsBody?.collisionBitMask = 0 
     addChild(bigSquare) 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 

     print("Contact detected") 
    }  
} 

後で、あなたはこのような何かを行う必要があります:ここでは、コードです

func didBeginContact(contact: SKPhysicsContact) { 

     var firstBody, secondBody: SKPhysicsBody 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 

      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 

      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 


     if ((firstBody.categoryBitMask & Collider.SmallSquare) != 0 && 
      (secondBody.categoryBitMask & Collider.BigSquare != 0)) { 

       print ("Contact detected") 
     } 

    } 

しかし、ゲームがある場合でもそのせずに、メッセージが出力されます最初に始まったのは物理的な世界で接触が検出されたからです。

関連する問題