我对Swift相当新,并且在多场景spritekit情况下遇到了巨大的麻烦。
让我给出一些背景知识:
我的游戏试图有三个屏幕;介绍,升级场景和播放场景。我的介绍场景只是初始化升级场景或根据用户触摸初始化播放场景(介绍屏幕上有两个按钮,选择播放或转到升级场景)。从升级屏幕,您可以按下各种按钮,这些按钮可以更改影响精灵速度,纹理和各种其他内容的变量。完成后,有一个按钮,用户可以按下该按钮来初始化播放场景。当精灵触摸播放场景中的另一个节点时,介绍屏幕会再次初始化。
我一直在努力的部分是试图让升级屏幕在播放屏幕上产生效果,而不会将所有变量全局声明(这适用于第一次播放,但尝试按下任何内容时再次屏幕我得到了大量的EXC和SIGABRT错误,可能是因为内存访问不好而导致的。)
例如:
UPGRADESCENE:
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)
}
}
}
所以希望是当我按下第三个按钮时,前两个按钮带来的变化将在下一个场景中携带它的功能中起作用:
PLAYSCENE:
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并将使用原始值运行地面速度,但不会识别按下按钮所做的更改。
问题
如何在不造成大量内存错误的情况下让我的升级场景影响我的播放场景?我是否可以以不同方式打开它而不是初始化它并将升级场景中所做的更改丢失为原始变量值,纹理等...?
答案 0 :(得分:0)
我的建议是不要让PlayScene
继承UpgradeScene
,特别是如果您的唯一目的是使用更新的值。事实上,正如您自己发现的那样,这些变化并未在PlayScene
中显示。
你错误地解释了继承的想法。您的评论//BUT IT JUST INITIALIZES THE ORIGINAL DECLARED VALUES
正如我所料。您无法继承更改。继承并不像那样工作。
您在避免全局变量方面做得正确。
您可能想要做的是设置一个包含和管理更改的类。我建议您使用NSUserDefaults
来跟踪更改,并使用类来解释更改。
例如,赛车游戏可能会让您以不同的速度自定义引擎。我将速度存储为整数,对于他们在自定义屏幕中选择的任何选项,我会更新NSUserDefaults
中的值。当玩家玩游戏的时候,我会有一个类来解释NSUserDefaults
中存储的数字,并为汽车提供适当的速度。