2016-07-14 10 views
0

このコードを実行すると、最初のCollisionWithplayer行が誤った命令エラーを表示します。このエラーは毎回表示されるのではなく、何度も何度も表示されるだけで、原因を特定するための類似の条件はありません。Swift:Physics Body Collision Bad Instruction Error

func didBeginContact(contact: SKPhysicsContact) { 
    let firstBody : SKPhysicsBody = contact.bodyA 
    let secondBody : SKPhysicsBody = contact.bodyB 


    if ((firstBody.categoryBitMask == PhysicsCategory.Goblin) && (secondBody.categoryBitMask == PhysicsCategory.Bullet) || 
     (firstBody.categoryBitMask == PhysicsCategory.Bullet) && (secondBody.categoryBitMask == PhysicsCategory.Goblin)) 
    { 

     CollisionWithBullet(firstBody.node as! SKSpriteNode, Bullet: secondBody.node as! SKSpriteNode) 
    } 
     else if ((firstBody.categoryBitMask == PhysicsCategory.Goblin) && (secondBody.categoryBitMask == PhysicsCategory.player) || 
     (firstBody.categoryBitMask == PhysicsCategory.player) && (secondBody.categoryBitMask == PhysicsCategory.Goblin)){ 

     CollisionWithplayer(firstBody.node as! SKSpriteNode, player: secondBody.node as! SKSpriteNode) 
      } 

func CollisionWithBullet(Goblin: SKSpriteNode, Bullet:SKSpriteNode){ 
    Goblin.removeFromParent() 
    Bullet.removeFromParent() 
    score += 1 
    ScoreLbl.text = "\(score)" 
    var explosion = SKEmitterNode(fileNamed: "Goblin Death Animation.sks") 
    explosion!.particlePosition = Goblin.position 
    self.addChild(explosion!) 
    var fire = SKEmitterNode(fileNamed: "Goblin Death Animation 2.sks") 
    fire!.particlePosition = Goblin.position 
    self.addChild(fire!) 


} 
func CollisionWithplayer(Goblin: SKSpriteNode, player: SKSpriteNode){ 
    let ScoreDefault = NSUserDefaults.standardUserDefaults() 
    ScoreDefault.setValue(score, forKey: "Score") 
    ScoreDefault.synchronize() 


    if (score > Highscore){ 

     let HighscoreDefault = NSUserDefaults.standardUserDefaults() 
     HighscoreDefault.setValue(score, forKey: "Highscore") 

    } 

    Goblin.removeFromParent() 
    player.removeFromParent() 
    self.view?.presentScene(EndScene()) 
    ScoreLbl.removeFromSuperview() 
} 

答えて

1

私は希望

(衝突が同じノードの2箇所で起こった)あなたのコードが1回の衝突が複数回発射するdidBeginContactメソッドの原因となるケースを扱っていないので、あなたがエラーを取得すると仮定このような場合を避けるために(オプションを使用して)このようなコードを書き直してください。さらに、私はそれを若干書き直したので、各衝突に対して2つのif文を書く必要はありません。

func didBeginContact(contact: SKPhysicsContact) { 
    let firstBody: SKPhysicsBody 
    let 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 == PhysicsCategory.Goblin) && (secondBody.categoryBitMask == PhysicsCategory.Bullet) { 
      collisionWithBullet(firstBody.node as? SKSpriteNode, bullet: secondBody.node as? SKSpriteNode) 
    } 

    if (firstBody.categoryBitMask == PhysicsCategory.Goblin) && (secondBody.categoryBitMask == PhysicsCategory.player) { 
      collisionWithPlayer(firstBody.node as? SKSpriteNode, player: secondBody.node as? SKSpriteNode) 
    } 
} 

func collisionWithBullet(goblin: SKSpriteNode?, bullet:SKSpriteNode?){ 
    guard let goblin = goblin, bullet = bullet else { return } 

    goblin.removeFromParent() 
    bullet.removeFromParent() 
    score += 1 
    scoreLbl.text = "\(score)" 
    if let explosion = SKEmitterNode(fileNamed: "Goblin Death Animation.sks") { 
      explosion.particlePosition = goblin.position 
      self.addChild(explosion) 
     } 
     if let fire = SKEmitterNode(fileNamed: "Goblin Death Animation 2.sks") { 
      fire.particlePosition = goblin.position 
      self.addChild(fire) 
     } 
    } 

    func collisionWithPlayer(goblin: SKSpriteNode?, player: SKSpriteNode?){ 
    guard let goblin = goblin, player = player else { return } 

    let scoreDefault = NSUserDefaults.standardUserDefaults() 
    scoreDefault.setValue(score, forKey: "Score") 
     // synchronised not needed anymore 


    if (score > highscore){ 
     let highscoreDefault = NSUserDefaults.standardUserDefaults() 
     highscoreDefault.setValue(score, forKey: "Highscore") 
    } 

    goblin.removeFromParent() 
    player.removeFromParent() 
    self.view?.presentScene(EndScene()) 
    scoreLbl.removeFromSuperview() 
} 

また、迅速なガイドラインに従ってください。あなたのメソッドとプロパティは、小文字から大文字に変わります。

希望します。

+0

ありがとうございました。返事が遅くなってごめん。これは私の問題を解決しました。 – Brian

+0

ようこそ。あなたは私の答えに印をつけて、それに多額の投票権を与えることがとても親切でしょうか?ハッピーコーディング。 – crashoverride777

+0

私はそれに賛成票を出したが、公に表示されるためにはもっと評判が必要だと言った。ありがとうございました。 – Brian