Как запросить данные из другой сцены в SpriteKit

У меня есть 2 SKScenes. В первой сцене есть 2 кнопки: кнопка игрока-мужчины и кнопка игрока-женщины. Во второй сцене есть 2 скрытых изображения: изображение игрока-мужчины и изображение игрока-женщины.

Если в Scene1 выбран игрок мужского пола, я хочу сделать изображение игрока мужского пола видимым в Scene2, но у меня возникают проблемы с передачей данных между SKScene. Я использую 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)
}

person viktorm    schedule 20.07.2016    source источник
comment
Вы уже пробовали что-нибудь? Если это так, пожалуйста, опубликуйте соответствующий код. Там нет упоминания о том, какой язык вы используете. Цель-С? Быстрый?   -  person jsondwyer    schedule 20.07.2016
comment
я отредактировал код для лучшего понимания, и это для набора спрайтов. Представлена ​​сцена 2, но игрок не появляется на сцене 2.   -  person viktorm    schedule 20.07.2016


Ответы (2)


Есть несколько способов сделать это. Вот один пример, в котором используется 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)
}
}
person jsondwyer    schedule 21.07.2016

В сцене 2 код:

var playerSelected: Scene1()

Создает новый экземпляр класса сцены 1, он не предоставляет ссылку на вашу исходную сцену 1. Чтобы получить доступ к свойствам сцены 1, вам нужно передать ссылку на нее из сцены 2.

person Ali Beadle    schedule 20.07.2016
comment
пожалуйста, сообщите, какая строка кода передает ссылку из сцены 2 в сцену 1. спасибо - person viktorm; 21.07.2016
comment
@viktorm Это будет сильно зависеть от общей структуры вашего кода. Сцена 2, вероятно, должна быть представлена ​​не из сцены 1, а скорее из контроллера представления более высокого уровня. На самом деле я бы спросил, почему у вас вообще две сцены — почему бы вашему игроку не выбирать спрайты в разных местах одной и той же сцены? Я думаю, вам нужно пересмотреть, как устроен ваш код и как объекты взаимодействуют друг с другом, иначе вы свяжете себя циклическими ссылками. - person Ali Beadle; 21.07.2016