在GameViewController中调用GameScene的函数

时间:2017-11-25 19:42:47

标签: swift sprite-kit

我在GameScene中有函数revivePlayer(),我试图从GameViewController中调用它。我现在在GameViewController中有以下解决方案:GameScene().revivePlayer() 这段代码确实调用了revivePlayer()函数,但对游戏没有任何作用。虽然如果我在revivePlayer()函数中添加print("test"),它会打印" test"在控制台中,但revivePlayer()函数内的其余代码似乎没有被调用。

这就是我在GameViewController中所拥有的内容,我删除了一些不相关的代码,并且我还使用了来自AdMob的奖励视频广告,并在广告关闭时调用了函数rewardBasedVideoAdDidClose():

class GameViewController: UIViewController, GKGameCenterControllerDelegate, GADRewardBasedVideoAdDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let view = self.view as! SKView? {
            // Load the SKScene from 'GameScene.sks'
            if let scene = SKScene(fileNamed: "MenuScene") {
                // Set the scale mode to scale to fit the window
                scene.scaleMode = .aspectFit

                // Present the scene
                view.presentScene(scene)
            }

            view.ignoresSiblingOrder = true
            view.showsPhysics = false
            view.showsFPS = false
            view.showsNodeCount = false
        }
    }

    override var shouldAutorotate: Bool {
        return true
    }

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        if UIDevice.current.userInterfaceIdiom == .phone {
            return .allButUpsideDown
        } else {
            return .all
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    }

    override var prefersStatusBarHidden: Bool {
        return true
    }

    func rewardBasedVideoAdDidClose(_ rewardBasedVideoAd: GADRewardBasedVideoAd) {
        videoAd = createVideoAd()
        GameScene().revivePlayer()
    }
}

1 个答案:

答案 0 :(得分:1)

GameScene().revivePlayer()正在revivePlayer实例上调用GameScene函数,而不是视图控制器中显示的游戏场景。

要解决此问题,请保留对所呈现的游戏场景的引用,并在该实例上调用revivePlayer

这样的事情应该有效,尽管这取决于你如何设置你的场景。

class GameViewController: UIViewController {

    @IBOutlet weak var skView: SKView!

    var gameScene = GameScene()

    override func viewDidLoad() {
        super.viewDidLoad()

        skView.presentScene(gameScene)

    }

    func myFunction() {
        gameScene.revivePlayer()
    }

}

编辑#1

以下评论的一个解决方案是使用SKView的{​​{1}}属性来获取对当前呈现的场景的引用。

scene

编辑#2

您还需要保留对if let gameScene = skView.scene as? GameScene { gameScene.revivePlayer() }

的引用
SKView