2017-12-26 23 views
6

以下は私の "Floor.swift"クラスで、基本的には壁の束です。私は、画面の上から来るオブジェクトを持っていて、FloorとSKSpriteNodesが衝突すると、SKSpriteNodeを削除したいと思います。以下は私のフロアクラスです。SKPhysicsBody Collision Not Working

import Foundation 
import SpriteKit 

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

     let leftWall = SKSpriteNode(color: UIColor.clear, 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.clear, 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.clear, 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) 

     self.physicsBody = SKPhysicsBody(bodies: [leftWall.physicsBody!, rightWall.physicsBody!, bottomWall.physicsBody!]) 

     self.physicsBody?.categoryBitMask = floorCategory 
     self.physicsBody?.contactTestBitMask = nailDropCategory | pointCategory | lifeCategory 
     self.physicsBody?.collisionBitMask = balloonCategory 
    } 

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

GameSceneクラス下の "FUNC didBegin(_接触:SKPhysicsContact)" 私は書いた:

func didBegin(_ contact: SKPhysicsContact) {   
     if (contact.bodyA.categoryBitMask == nailDropCategory | pointCategory | lifeCategory) && (contact.bodyB.categoryBitMask == floorCategory) { 
      // contact.bodyB.node!.removeFromParent() 
      print("COLLISION") 
     } 
} 

あなたが見ることができるように、私の床クラスで私はself.physicsBody = SKPhysicsBody」としてオブジェクトを設定しました(bodies :) "を私のSKSpriteNodeで置き換えます。しかし何らかの理由で私はこれまでどんな検出が得られていない。私は自分の "Floor"クラスを、objectCategory、pointCategory、lifeCategoryの各クラスの "contactTestBitMask"にしました。これは今私が何分も考えていない問題です。

更新:

ここでこのコードを使用していますが、動作しています。問題は、デフォルトのケースでも私の "balloonCategory"も削除されているので、それをやりたくはありません。そのカテゴリだけを無視するだけでなく、バ​​ルーンの壁としても機能するようにするにはどうすればよいですか?

func didBegin(_ contact: SKPhysicsContact) { 
     let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

     switch contactMask { 
     case balloonCategory | nailDropCategory: 
      print("nailDrop and balloon have contacted.") 
      contact.bodyB.node!.removeFromParent() 
      self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false)) 
      lifeLost -= 1 
     case balloonCategory | pointCategory: 
      print("point and balloon have contacted.") 
      contact.bodyB.node!.removeFromParent() 
      totalPoints += 2 
      self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
     case balloonCategory | lifeCategory: 
      print("life and balloon have contacted.") 
      contact.bodyB.node!.removeFromParent() 
      lifeLost += 1 
      self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
     default:    
      contact.bodyB.node!.removeFromParent() 
      print("Removed \(String(describing: contact.bodyB.node!.name))") 
     } 
    } 
+0

nailDropCategory? pointCategory? lifeCategory?ビットマスクをどのように定義するかはわかりません。 –

+0

さて、私は他のすべてのクラスでそれを定義しました。他のすべての衝突はうまく動いていますので、私は忘れました。 – Dewan

+1

物理が既にプロジェクトで動作している場合は、このように動作するはずです。 Githubのサンプルプロジェクトと共有でこの問題を再現できますか?ソリューションのようなデバッグから来るかもしれないようだ。 – peacetype

答えて

5

すべてのあなたのオブジェクト型に名前を割り当てることが有益であるようなのでようですが、聞こえる:あなたはスイッチで小切手を作るとき

class Balloon: SKSpriteNode { 
    init() { 
     super.init(texture: nil, color: .blue, size: CGSize(width: 50, height: 50)) 
     self.name = "balloon" 
    } 
} 

今、あなたが削除することを決定する前に、オブジェクトの身元を確認することができますそれら。下記のswitch文でデフォルトのケースに行った変更を参照してください。この方法では、バルーンの場合、ノードは削除されません。物理的な衝突は引き続き機能します。

func didBegin(_ contact: SKPhysicsContact) { 
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    switch contactMask { 
    case balloonCategory | nailDropCategory: 
     print("nailDrop and balloon have contacted.") 
     contact.bodyB.node!.removeFromParent() 
     self.run(SKAction.playSoundFileNamed("lostlifesound.mp3", waitForCompletion:false)) 
     lifeLost -= 1 
    case balloonCategory | pointCategory: 
     print("point and balloon have contacted.") 
     contact.bodyB.node!.removeFromParent() 
     totalPoints += 2 
     self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
    case balloonCategory | lifeCategory: 
     print("life and balloon have contacted.") 
     contact.bodyB.node!.removeFromParent() 
     lifeLost += 1 
     self.run(SKAction.playSoundFileNamed("pointsound.mp3", waitForCompletion:false)) 
    default: 
     if contact.bodyB.node!.name == "balloon" { 
      print("Balloon collided but we will not remove it.") 
      return 
     } else { 
      contact.bodyB.node!.removeFromParent() 
      print("Removed \(String(describing: contact.bodyB.node!.name))") 
    } 
} 
+0

おい、本当にありがとう!あなたは祝福の仲間です、そして、あなたは素晴らしい新年を願っています!もう一度、ありがとうございます – Dewan

+1

あなたと同じで、あなたのゲームで最高の運があります! – peacetype

+1

ありがとう!最後に、iOS向けの個人的にお気に入りの広告ネットワークは何ですか? – Dewan

1

nodeBが床であり、nodeAが実際にnailDropCategory | pointCategory | lifeCategoryであることを保証することはできませんか?

私はnaildDroppointlifeはあなたがいずれかがfloorに触れるので、このようなあなたのdidBegin(contact:)を構築しようとしたときのために通知したい3つのオブジェクトであると仮定しています:

func didBegin(_ contact: SKPhysicsContact) { 
    print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))") 

    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask 

    switch contactMask { 
    case nailDropCategory | FloorCategory: 
     print("nailDrop and floor have contacted.") 
    case pointCategory | FloorCategory: 
     print("point and floor have contacted.") 
    case lifeCategory | FloorCategory: 
     print("life and floor have contacted.") 
    default: 
     print("Undetected collision occurred") 
    } 
} 

は、あなたが実際に作成しましたFloorクラスのオブジェクトですか?

+0

"didBeginContactはnilとnilのために入力されました"と言って、スイッチの "default:"を返します。また、「self.physicsBody = SKPhysicsBody(bodies:[leftWall.physicsBody !, rightWall.physicsBody !, bottomWall.physicsBody!])」という行は、私の既存のphysicsBodyと重複し、いくつかの問題を引き起こします。私は完全に失われているので、何が起こっているのか分かりません。 – Dewan

+0

あなたは何かが連絡したことを知っています - あなたのシーンのすべてのノードが名前を持っていることを確認してください。私はあなたが自分自身を言うときにあなたが何を意味しているのか分かりません.Bodyは...あなたのコードに従って、Floorオブジェクトは既存の物理ボディを持たないので、既存の物理ボディと重なっています。 –

+0

SKPhysicsBody配列には、すべてのボディーと、このコード行 "bottomWall.physicsBody = SKPhysicsBody(rectangleOf:bottomWall.size)"があり、leftWallとrightWallに対しても同様でした。私は文字通り二重のPhysics Bodyを作成していて、重複しているので、この時点で何が起こっているのか分かりません。これはストレスです – Dewan