【问题标题】:Swift 5 Calling GameOver method simultaneously from two methods crashing gameSwift 5 从两种方法同时调用 GameOver 方法导致游戏崩溃
【发布时间】:2020-08-15 23:02:35
【问题描述】:

我正在学习编码并学习“颜色切换”教程。我试图加强我的知识,并创造了 2 个开关和落球。

一旦球接触到开关,我就会遇到问题。我有两个开关的开始联系方法,如果错误,调用 gameOver 方法。但是当两个开关都出错时,它们都会同时调用 gameOver 方法,导致我的游戏崩溃。我该如何解决这个问题?任何帮助将不胜感激,谢谢!

当前代码:

extension GameScene: SKPhysicsContactDelegate {

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

    if contactMask == PhysicsCategories.ballCategory | PhysicsCategories.switchCategory {
        if let ball = contact.bodyA.node?.name == "Ball" ? contact.bodyA.node as? SKSpriteNode : contact.bodyB.node as? SKSpriteNode {
            if currentColourIndex == switchState.rawValue {
                score += 1
                updateScoreLabel()
                ball.run(SKAction.fadeOut(withDuration: 0.15)) {
                    ball.removeFromParent()
                    self.spawnBall()
                }
            } else {
                gameOver()
            }
        }
    }

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

    if contactMask2 == PhysicsCategories2.ballCategory2 | PhysicsCategories2.switchCategory2 {
        if let ball2 = contact.bodyA.node?.name == "Ball2" ? contact.bodyA.node as? SKSpriteNode : contact.bodyB.node as? SKSpriteNode {
            if currentColourIndex2 == switchState2.rawValue {
                score += 1
                updateScoreLabel()
                ball2.run(SKAction.fadeOut(withDuration: 0.15)) {
                    ball2.removeFromParent()
                    self.spawnBall2()
                }
            } else {
                gameOver()
            }
        }
    }


}


}


func gameOver() {
    UserDefaults.standard.set(score, forKey: "RecentScore")
    if score > UserDefaults.standard.integer(forKey: "Highscore") {
        UserDefaults.standard.set(score, forKey: "Highscore")
    }

    let menuScene = MenuScene(size: view!.bounds.size)
    view!.presentScene(menuScene)
  }

【问题讨论】:

    标签: swift physics contacts simultaneous


    【解决方案1】:

    首先要了解的是它不是同时发生的。它被调用两次,但一次调用一次。

    所以,要解决这个问题,只需向gameOver() 添加代码,这样第二次调用就会被忽略。例如。

    var gameIsOver = false
    
    func gameOver() {
        guard !gameIsOver else { return }
        gameIsOver = true
    
        UserDefaults.standard.set(score, forKey: "RecentScore")
        if score > UserDefaults.standard.integer(forKey: "Highscore") {
            UserDefaults.standard.set(score, forKey: "Highscore")
        }
    
        let menuScene = MenuScene(size: view!.bounds.size)
        view!.presentScene(menuScene)
    }
    

    如果你重用这个对象,你需要将gameIsOver重新设置为false。

    解决此问题的另一种方法是确保多次调用安全。也许view 在第二次调用中为零。

    如果你能提供帮助,你永远不应该使用view!。更好的方法是

    guard let view = view else { return }
    

    一开始。如果 view 为 nil,该函数将立即返回。其余的函数你可以使用view.boundsview.presentScene 因为在守卫之后视图不能为零。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      • 2011-01-18
      相关资源
      最近更新 更多