从SpriteKit中的另一个类到GameScene()内部的函数不起作用

时间:2018-02-12 03:07:02

标签: swift sprite-kit

我在GameScene类中有这个函数

class GameScene: SKScene {
    func runGameOver() {
        self.removeAllActions()
        self.enumerateChildNodes(withName: "Bullet") {
            bullet, stop in
            bullet.removeAllActions()
        }

        self.enumerateChildNodes(withName: "Enemy") {
            enemy, stop in
            enemy.removeAllActions()
        } 
    }
}

我正在尝试从另一个类中的另一个函数运行runGameOver函数。每当敌人从livesNumber离开屏幕时,就会调用loseALife函数。

如果我为GameScene声明了变量/常量,就像在 让object = GameScene() 然后使用 object.runGameOver()调用该函数应用程序崩溃,因此,我正在调用它,如下所示 GameScene()。runGameOver()但它没有工作。我该如何访问该功能?

class LivesSystem {
    func loseALife() {
        livesNumber -= 1

        if livesNumber == 0 {
            GameScene().runGameOver()
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题是你正在制作一个新假GameScene(),这当然是错误的做法。为了能够与真实(当前呈现的那个)GameScene进行互动,您可以使用NotificationCenter,这样做:

1)在你的GameScene中,让我们观察一下游戏结束:

class GameScene: SKScene {
    override func sceneDidLoad() {
        super.sceneDidLoad()
        NotificationCenter.default.addObserver(forName: Notification.Name.init("game_over"), object: nil, queue: OperationQueue.main) { [weak self] (notification) in
            self?.runGameOver()
        }
    }

    func runGameOver() {
        self.removeAllActions()
        self.enumerateChildNodes(withName: "Bullet") {
            bullet, stop in
            bullet.removeAllActions()
        }

        self.enumerateChildNodes(withName: "Enemy") {
            enemy, stop in
            enemy.removeAllActions()
        }
    }
}

2)在LivesSystem需要的时候,通过以下方式启动通知:

class LivesSystem {
    var livesNumber = 3

    func loseALife() {
        livesNumber -= 1

        if livesNumber == 0 {
            NotificationCenter.default.post(name: Notification.Name.init("game_over"), object: nil)
        }
    }
}