从 GameViewController 访问按钮、标签和 uiimageviews 到 GameScene

Posted

技术标签:

【中文标题】从 GameViewController 访问按钮、标签和 uiimageviews 到 GameScene【英文标题】:Access buttons,labels and uiimageviews from GameViewController to GameScene 【发布时间】:2015-08-27 14:02:01 【问题描述】:

在我的 GameViewController 中,我有按钮标签和所有设置。在 viewDidLoad() 下,我已将标签和所有内容设置为 .hidden = true,而我的 gameOver 内容位于我的 GameScene 文件中,我无法将按钮标签设置为 .hidden = true。该按钮称为 backToMenu,如果我在 GameViewController 中的任何位置键入它,它会识别它,但是当我尝试在 GameScene 中键入 backToMenu.hidden = false 时,它会给我一个错误。有什么方法可以让我在 GameScene 中访问它们?

游戏场景代码:

func gameOver() 

        bigBox.hidden = false
        backToMenu.hidden = false
        scoreLabel.hidden = false

        var alrentSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("MenuSelect", ofType: "mp3")!)

        AVAudiosession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)

        var error: NSError?
        screenTapped = AVAudioPlayer(contentsOfURL: alrentSound, error: &error)
        screenTapped.prepareToPlay()
        screenTapped.stop()

        square1.removeFromParent()
        wallGen.stopWalls()
        //diamondGen.stopDiamonds()
        movingGround.stop()
        square1.stop()
        //square2.stop()


        // save current points label value
        let pointsLabel = childNodeWithName("pointsLabel") as! PPPointsLabel
        let highscoreLabel = childNodeWithName("highscoreLabel") as! PPPointsLabel


        if highscoreLabel.number < pointsLabel.number 
            highscoreLabel.setTo(pointsLabel.number)

            let defaults = NSUserDefaults.standardUserDefaults()
            defaults.setInteger(highscoreLabel.number, forKey: "highscore")
        

    

GameVieController 代码:

@IBOutlet weak var bigBox: UIImageView!
    @IBOutlet weak var backToMenu: UIButton!
    @IBOutlet weak var scoreLabel: UILabel!



    @IBAction func backToMenuButton(sender: AnyObject) 

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewControllerWithIdentifier("MainMenuViewController") as! UIViewController
        self.dismissViewControllerAnimated(true, completion: nil)

        var alrentSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("MenuSelect", ofType: "mp3")!)

        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, error: nil)
        AVAudioSession.sharedInstance().setActive(true, error: nil)

        var error: NSError?
        screenTapped = AVAudioPlayer(contentsOfURL: alrentSound, error: &error)
        screenTapped.prepareToPlay()
        screenTapped.play()

    

    override func viewDidLoad() 
        super.viewDidLoad()

        bigBox.hidden = true
        backToMenu.hidden = true
        scoreLabel.hidden = true


        // Configure the view
        let skView = view as! SKView


        // store a ref
       // gameScene.gameDelegate = self

        // Create and configure the scene
        gameScene = GameScene(size: skView.bounds.size)
        gameScene?.scaleMode = .AspectFill

        // Present the scene
        skView.presentScene(gameScene)

【问题讨论】:

【参考方案1】:

这是因为变量在不同的类中。做到这一点的一种方法,可能是声明变量类变量,像这样

class var myVariable = // whatever

如果你想清理你的代码,你也可以有静态 getter,像这样

static func getMyVariable() -> MyVariableType

    return myVariable

这样变量就可以从任何地方访问,并且要访问它们你输入

GameViewController.getMyVariable()

GameViewController.myVariable

【讨论】:

【参考方案2】:

您需要设置一种方法来访问 GameScene 中的 GameViewController 方法。这可以通过创建对 GameViewController 的引用来完成。为此,我建议您查看这篇文章:Segue in SKScene to UIViewController

【讨论】:

以上是关于从 GameViewController 访问按钮、标签和 uiimageviews 到 GameScene的主要内容,如果未能解决你的问题,请参考以下文章

Swift,SpriteKit,GameViewController 和 MainViewController 在 GameOver 之后的 Segue

无法将“UIView”类型的值转换为“SKView”

SpriteKit 游戏逻辑

从 UIViewController 呈现 SKScene - Swift

将 GameViewController.swift 链接到 GameScene.swift

我收到错误消息,“从不兼容的类型“gameViewController”分配给“id avaudioplayerdelegate””[关闭]