我在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()
}
}
答案 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