Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在不初始化场景的情况下在场景之间切换_Ios_Xcode_Swift - Fatal编程技术网

Ios 在不初始化场景的情况下在场景之间切换

Ios 在不初始化场景的情况下在场景之间切换,ios,xcode,swift,Ios,Xcode,Swift,我对斯威夫特相当陌生,在多场景的spritekit环境中遇到了巨大的麻烦 让我介绍一些背景情况: 我的游戏试图有三个屏幕;介绍、升级场景和游戏场景。我的介绍场景只是根据用户的触摸初始化升级场景或初始化播放场景(介绍屏幕上有两个按钮,选择播放或转到升级场景)。在升级屏幕中,您可以按下各种按钮,更改影响精灵速度、纹理和各种其他内容的变量。完成后,用户可以按下一个按钮来初始化播放场景。当精灵接触到游戏场景中的另一个节点时,介绍屏幕将再次初始化 我一直在做的一个棘手的部分是,试图让升级屏幕在不声明所有变

我对斯威夫特相当陌生,在多场景的spritekit环境中遇到了巨大的麻烦

让我介绍一些背景情况:

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

我一直在做的一个棘手的部分是,试图让升级屏幕在不声明所有变量全局的情况下对播放屏幕产生影响(这在第一次播放时起到了作用,但在再次尝试按屏幕上的任何内容时,我得到了大量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
    }
}
PlaySecene继承自Upgrade场景,将使用原始值运行groundspeed,但无法识别对按钮按下所做的更改

问题


如何让升级场景在不导致大量内存错误的情况下影响播放场景?我是否可以以不同的方式打开它,而不是初始化它并将升级场景中所做的更改丢失到原始变量值、纹理等?

我的建议是不要让
播放场景
升级场景
继承,尤其是如果您的唯一目的是使用更新的值。事实上,正如您自己所发现的,这些更改不会显示在
playsecene

你误解了继承的概念。您的注释
//但它只是初始化原始声明的值
,这正是我所期望的。您不能继承更改。继承不是这样工作的

避免使用全局变量是正确的

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


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

谢谢你,开尔文。因此,我们的想法是在NSUserDefaults中声明变量,然后在我的PlaySecene函数中从NSUserDefaults类调用整数?我有点困惑,如果没有NSUserDefaults,它会是什么样子,为什么不会以同样的方式。当然。在升级场景中,每当用户进行修改时,都可以将值保存到
NSUserDefaults
中。然后,当移到播放场景时,可以调用
NSUserDefaults
查询值,并适当调整修改。您不必使用
NSUserDefaults
;我只是觉得这是简单复杂游戏最简单的方法。如果您不需要为下一个会话记录任何数据,我已经开发了一些应用程序,您只需使用UIViewController的
prepareForSegue
方法将值传递给
GameViewController
,在
GameScene
中设置更改。请注意,此设置与您的设置不同;您每次都将使用segue访问
游戏场景
,您的其他视图将不是
SKScene
,而是
UIViewController