【问题标题】:How to change a global int in SpriteKit with Swift?如何使用 Swift 更改 SpriteKit 中的全局 int?
【发布时间】:2016-05-06 19:13:19
【问题描述】:

所以我将一个类似的游戏编码为 4 个图像 1 个单词。我希望当我例如在第 5 级时关闭游戏并将其从我的历史记录中删除,然后再次返回游戏并按播放我可以在第 5 级恢复。我尝试使用全局变量( LevelNumber) 是一个 int 值,其值为 1,这意味着它高于 classLevel1: Skscene{ :

var levelNumber = 1
class Level1: SKScene {

在级别 1 的 Win 函数中,我将 levelNumber 的值设置为 2(因为您完成了级别 1)并保存:

func Win() {
    levelNumber == 2
    NSUserDefaults.standardUserDefaults().setInteger(levelNumber, forKey: "levelNumber")
}

*edit 在 MainMenu 场景中我说:

 override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if levelNumber == 1 {
    let Level = Level1(size: self.size)
    Level.scaleMode = scaleMode
    let transition = SKTransition.fadeWithDuration(0.5)
    self.view?.presentScene(Level, transition: transition)
    }

    else if levelNumber == 2{
        let Level = Level2(size: self.size)
        Level.scaleMode = scaleMode
        let transition = SKTransition.fadeWithDuration(0.5)
        self.view?.presentScene(Level, transition: transition)
    }

    else if levelNumber == 3 {
        let Level = Level3(size: self.size)
        Level.scaleMode = scaleMode
        let transition = SKTransition.fadeWithDuration(0.5)
        self.view?.presentScene(Level, transition: transition)
    }

所有级别的等等。

这是 AppDelegate.swift 中的代码

import UIKit

@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var oldScore : Int = NSUserDefaults.standardUserDefaults().integerForKey("oldScore")
var oldlevelNumber : Int = NSUserDefaults.standardUserDefaults().integerForKey("oldlevelNumber")

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    Score += oldScore
    levelNumber += oldlevelNumber
    return true
}

func applicationWillTerminate(application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    NSUserDefaults.standardUserDefaults().setInteger(Score, forKey: "oldScore")
    NSUserDefaults.standardUserDefaults().synchronize()
    NSUserDefaults.standardUserDefaults().setInteger(levelNumber, forKey: "oldlevelNumber")
    NSUserDefaults.standardUserDefaults().synchronize()
}

但是由于某种原因,当我按 Play 时,进入 Level 1(不调用 win 函数),然后重新启动游戏并按 Play 我进入 Level 2 甚至没有赢得 Level 1,为什么?

【问题讨论】:

  • LevelNumberlevelNumber 不同。此外,变量应始终以小写字母开头。
  • 对不起,我写错了,在我的代码中它与其他代码相同,所以它是小写 L.
  • Score 是在哪里创建的?
  • 看看我的编辑也许你可以看到我在 MainMenu 场景中犯的一个错误

标签: swift sprite-kit


【解决方案1】:

在你的 Win 函数中,像这样设置你的变量:

levelNumber = 2

代替

levelNumber == 2

【讨论】:

  • 您当前的代码看起来不错...您能再显示一些吗?
  • 您检索 NSUserDefault 信息的代码
  • 这是我保存 levelNumber 的 AppDelegate 代码:
  • 太长了,一会
  • 尝试在应用程序的 didFinishLaunchingWithOptions 方法中声明您的 oldScore 和 oldlevelNumber。
【解决方案2】:

我猜你想分配 scorelevelNumber 而不是添加它们。

你有什么:

score += oldScore
levelNumber += oldlevelNumber

你可能想要什么:

score = oldScore
levelNumber = oldlevelNumber

【讨论】:

  • @LukasDomeisen 我建议在继续使用您的应用程序之前重新学习一些 Swift 基础知识。如果您不知道+===== 之间的区别,您将会遇到很多问题。
  • 我的游戏快玩完了,这是我现在不能放弃的唯一事情。如果您找不到解决方案,我会找到其他可能会的人。
  • @LukasDomeisen 这是正确的答案。在您描述的情况下,您跳过了级别 1 并进入了级别 2。这是因为您将 oldScore 添加到新分数中。如果您只是设置它,它将是 1。如果您再次运行该项目,您将处于 3 级。这个答案应该适合您
猜你喜欢
  • 2021-11-02
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多