2017-12-22 27 views
2

私は、基本的に壁の束である私の "Floor.swift"クラスを持っています。私は、画面の上から来るオブジェクトを持っていて、FloorとSKSpriteNodesが衝突すると、SKSpriteNodeを削除したいと思います。以下は私のフロアクラスです。 「func didBegin(_ contact: SKPhysicsContact)」の下で私のGameSceneクラスで次にSKPhysicsContact not detected categoryBitMask Collision

import Foundation 
import SpriteKit 

    class Floor: SKNode { 
     override init() { 
      super.init() 

      let leftWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50)) 
      leftWall.position = CGPoint(x: 0, y: 50) 
      leftWall.physicsBody = SKPhysicsBody(rectangleOf: leftWall.size) 
      leftWall.physicsBody!.isDynamic = false 
      self.addChild(leftWall) 

      let rightWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 5, height: 50)) 
      rightWall.position = CGPoint(x: 375, y: 50) 
      rightWall.physicsBody = SKPhysicsBody(rectangleOf: rightWall.size) 
      rightWall.physicsBody!.isDynamic = false 
      self.addChild(rightWall) 

      let bottomWall = SKSpriteNode(color: UIColor.brown, size: CGSize(width: 500, height: 10)) 
      bottomWall.position = CGPoint(x: 150, y: -5) 
      bottomWall.physicsBody = SKPhysicsBody(rectangleOf: bottomWall.size) 
      bottomWall.physicsBody!.isDynamic = false 
      self.addChild(bottomWall) 

      // Set the bit mask properties 
      self.physicsBody?.categoryBitMask = floorCategory 
      self.physicsBody?.contactTestBitMask = objectCategory | pointCategory | lifeCategory 
      self.physicsBody?.collisionBitMask = dodgeCategory 
     } 

     required init?(coder aDecoder: NSCoder) { 
      fatalError("init(coder:) has not been implemted") 
     } 
    } 

私が書いた:

if (contact.bodyA.categoryBitMask == floorCategory) && (contact.bodyB.contactTestBitMask == objectCategory | pointCategory | lifeCategory) { 
       contact.bodyB.node!.removeFromParent() 
       print("COLLISION") 
} 

しかし、私はそう今までに何任意の検出が届かない何らかの理由で。私は自分の "Floor"クラスを、objectCategory、pointCategory、lifeCategoryの各クラスの "contactTestBitMask"にしました。何が間違っているのですか?私の他の衝突は検出されますが、この衝突は検出されません。

答えて

3

あなたleftWallrightWallbottomWallはデフォルトcontactTestcollisionビットマスクを持っているので、すべてのものと衝突し、何も連絡先を生成します。彼らはすべてisDynamicプロパティがfalseに設定されていることを除いて、他のものがtrueに設定されている場合は、他のものが衝突して接触する可能性があります。

これはおそらくあなたが望むものです(床と壁は通常動的ではありません)。私は実際の問題は、Floorクラスのオブジェクトは、他のどこかで初期化しない限り、物理的なボディを持たないということです。あなたはこれらの行があります。

self.physicsBody?.categoryBitMask = ... self.physicsBody?.contactTestBitMask = ... self.physicsBody?.collisionBitMask = ...

をしかし、あなたは実際にself.physicsBodyを作成していません。オプションの連鎖(self,phyicsBody?)を使用したことを除いて、コードがクラッシュする可能性があるため、Swiftは '?'になり、「オハイオ州 - オプションであり、存在しません。 (SKPhysicsBodyはイニシャライザを持って

Self.physicsBody = SKPhysicsBody(Bodies: [leftWall.physicsBody, rightWall.PhysicsBoidy, bottomWall.physicsBody])

:私はちょうど3つの壁オブジェクトの物理体を使用して、Floorオブジェクトのための物理学のボディを作成してみてください、」その後、ここでは非常に少なくとも

を停止されます新しい物理体を作成するために物理体の配列を取る)。

+0

は私がやってみました「ourUnionOfBodies = SKPhysicsBodyをしましょう(体:[!leftWall.physicsBody!rightWall.physicsBody!bottomWall.physicsBody])」と、私は次の行に「ourUnionOfBodies.isDynamic = false」と書いたが、それ以下のことまだ動作しませんか?私は彼らがちょうど – Dewan

+0

@DewanハイDewanを介して右に落ちる衝突検出が表示されません - あまりにも遅れて返信申し訳ありませんが、私は旅行していた。だからあなたは 'ourUnionOfBodies'物理体を作成しました。その物理体を非動的に設定しましたが、Floorオブジェクトの物理体としてこれをどこにでも設定しましたか? 'self.physicsBody?... 'のいずれかを実行する前に' self.physicsBody = 'を実行する必要があります。 'self.physicsBody = SkyphysicsBody(bodies ...')ではなく、物理ボディを保持する別のプロパティを作成した理由は何ですか? –

+0

私はそれを試みましたが、実際には違いはありませんでした。衝突検出が見えません。彼らは私のフロアに落ち続けた – Dewan