ios - 在场景之间切换而不初始化场景

标签 ios xcode swift

我对 Swift 相当陌生,在处理多场景 spritekit 情况时遇到了巨大的麻烦。

让我介绍一下背景:

我的游戏正在尝试拥有三个屏幕;介绍、升级场景和游戏场景。我的介绍场景只是根据用户触摸初始化升级场景或初始化播放场景(介绍屏幕上有两个按钮,选择播放或转到升级场景)。在升级屏幕上,您可以按各种按钮来更改影响 Sprite 速度、纹理和各种其他内容的变量。完成后,用户可以按下一个按钮来初始化播放场景。当 Sprite 触摸游戏场景中的另一个节点时,简介屏幕会再次初始化。

我一直在研究的棘手部分是尝试让升级屏幕对播放屏幕产生影响,而不声明所有全局变量(这适用于第一次播放,但在尝试按播放屏幕上的任何内容时)再次屏幕上我收到大量 EXC 和 SIGABRT 错误,可能是由于内存访问错误)。

例如:

升级场景:

class UpgradeScene: SKScene, SKPhysicsContactDelegate {

    var groundspeed = 5.0
    var hero = SKSpriteNode(imageNamed:"Hero")

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent){

        for touch: AnyObject in touches{

            let location = touch.locationInNode(self)

            if self.nodeAtPoint(location) == self.sbutton1 {
                groundspeed = 25.0
            }

            if self.nodeAtPoint(location) == self.sbutton2 {
                hero.texture = SKTexture(imageNamed:"Hero2")
            }

            if self.nodeAtPoint(location) == self.playscenebutton {
                var scene = PlayScene(size:self.size)
                let skView = self.view! as SKView
                scene.scaleMode = .ResizeFill
                scene.size = skView.bounds.size
                skView.presentScene(scene)
            }
        }
}

所以希望当我按下第三个按钮时,前两个按钮带来的变化将在下一个场景中承载它的函数中起作用:

游戏场景:

class PlayScene: UpgradeScene{

    override func update(currentTime: NSTimeInterval) {

        runningbar.position.x -= CGFloat(groundspeed)

        //SO THE GROUNDSPEED CHANGE FROM THE OTHER SCENE WOULD WORK HERE...
        //BUT IT JUST INITIALIZES THE ORIGINAL DECLARED VALUES
    }
}

PlayScene 继承自 UpgradeScene,并将使用原始值运行地面速度,但无法识别按下按钮时所做的更改。

问题

如何让我的升级场景影响我的游戏场景而不导致一堆内存错误?我可以以不同的方式打开它,而不是初始化它并丢失升级场景中对原始变量值、纹理等所做的更改...吗?

最佳答案

我的建议是不要让 PlayScene 继承 UpgradeScene,特别是如果您的唯一目的是使用更新的值。事实上,正如您自己发现的那样,这些更改不会显示在 PlayScene 中。

您误解了继承的概念。您的评论 //BUT IT JUST INITIALIZES THE ORIGINAL DECLARED VALUES 正如我所期望的那样。您无法继承更改。继承不是这样工作的。

您避免全局变量是正确的。

您可能想要做的是设置一个类来保存和管理更改。我建议您使用 NSUserDefaults 来跟踪更改,并使用类来解释更改。

例如,赛车游戏可能允许您自定义不同速度的引擎。我会将速度存储为整数,并且对于他们在自定义屏幕中选择的任何选项,我将更新 NSUserDefaults 中的值。当玩家玩游戏时,我将有一个类来解释存储在 NSUserDefaults 中的数字并为汽车提供适当的速度。

关于ios - 在场景之间切换而不初始化场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30648519/

相关文章:

xcode - 如何使用 swift 将图像从 Images.xcassets 加载到 UIImage

ios - 在 ARC 中对局部变量使用 __weak

ios - 如何快速创建和添加值到字典

ios - Xcode 8.2 模拟器在调试时崩溃并退出保存屏幕截图

c++ - XCode:使用全局变量时出现重复符号错误

swift - 电子邮件验证器 RxSwift?

iphone - Objective-C - 从今天(明天)开始的第二天

iOS QuickBlox SDK 按用户 ID 过滤自定义对象

iPhone "_OBJC_CLASS_"编译错误

ios - 随机选择一个UIImage