【问题标题】:How to request data from another scene in SpriteKit如何从 SpriteKit 中的另一个场景请求数据
【发布时间】:2016-07-20 18:42:14
【问题描述】:

我有 2 个SKScenes。第一个场景有 2 个按钮:一个男性玩家按钮和一个女性玩家按钮。第二个场景有两个隐藏图像:一个男性玩家图像和一个女性玩家图像。

如果在Scene1 中选择了男性玩家,我想让男性玩家图像在Scene2 中可见,但我无法在SKScenes 之间传递数据。我正在使用 Sprite Kit 并在 Swift 中编程。请指教。

这是我迄今为止尝试过的:

// Scene1:

import SpriteKit

class Scene1: SKScene {

var malePlayer = SKSpriteNode()
var femalePlayer = SKSpriteNode()

var maleSelect = false
var femaleSelect = false

// in touches began..
if self.nodeAtPoint(location) == self.malePlayer {
            maleSelect = true
// then i present scene2

} else if self.nodeAtPoint(location) == self.femalePlayer {
            femaleSelect = true
//then i present scene2



// in scene 2:
class Scene2: SKScene {
var playerSelected: Scene1()
// did move to view
var boy = SKSpriteNode()
var girl = SKSpriteNode()

if self.playerSelected.maleSelect == true {
self.addChild(boy)
} else if self.playerSelected.femaleSelect == true {
self.addChild(girl)
}

【问题讨论】:

  • 你有没有尝试过?如果是这样,请发布相关代码。没有提及您使用的是什么语言。目标-C?斯威夫特?
  • 我编辑了代码以便更好地理解,它适用于 sprite kit。场景 2 出现了,但玩家没有出现在场景 2 中。

标签: ios sprite-kit skscene


【解决方案1】:

有几种方法可以做到这一点。这是一个使用NSUserDefaults 的示例。使它成为一个不错选择的一个原因是,即使在应用关闭后,选择仍会保留,并且可以在应用下次打开时重新加载。

要保存选择,请使用以下代码:

    if self.nodeAtPoint(location) == self.malePlayer {

        //save the selection in NSUserDefaults
        NSUserDefaults.standardUserDefaults().setBool(true, forKey:"maleSelected")

        //present next scene

    } else if self.nodeAtPoint(location) == self.femalePlayer {

        //save the selection
        NSUserDefaults.standardUserDefaults().setBool(false, forKey:"maleSelected")

        //present next scene
    }

该值现在保存在本地存储中。当您需要访问其他场景中的选择时,请从NSUserDefaults 中获取值:

所以Scene2 可能看起来像这样:

class Scene2: SKScene {
var playerSelected: Scene1()

// did move to view
var boy = SKSpriteNode()
var girl = SKSpriteNode()

//grab the selection value
let maleSelected = NSUserDefaults.standardUserDefaults().boolForKey("maleSelected")

if maleSelected == true {
self.addChild(boy)
} else {
self.addChild(girl)
}
}

【讨论】:

    【解决方案2】:

    在场景 2 中的代码:

    var playerSelected: Scene1()
    

    创建场景 1 类的新实例,它不提供返回原始场景 1 的链接。要访问场景 1 的属性,您需要从场景 2 传递对它的引用。

    【讨论】:

    • 请告知将引用从场景 2 传递到场景 1 的代码行。谢谢
    • @viktorm 这将高度依赖于代码的整体结构。场景 2 可能不应该从场景 1 呈现,而是从更高级别的视图控制器呈现。事实上我会质疑为什么你有两个场景——为什么不让你的玩家在同一个场景的不同位置选择精灵?我认为您需要重新审视代码的结构以及对象之间的交互方式,否则您将陷入循环引用中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    相关资源
    最近更新 更多