2017-01-06 2 views
2

У меня есть сцена GameOver с кнопкой на сцену настроек. (Код, показанный ниже) Я хочу добавить кнопку на сцене MainMenu, чтобы сделать то же самое, отправить пользователя на сцену настроек, но я хочу только одну кнопку «Назад» на сцене «Настройки». Я предполагаю, что это может быть выполнено с помощью инструкции IF. Если пользователь приходит из сцены, перейдите в B else, если пользователь приходит из X-сцены, переместитесь в сцену Y.SpriteKit: как определить предыдущую сцену, из которой пользователь приходит?

Как я могу рассказать в SpriteKit, с какой сцены происходит пользователь?

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

    for touch: AnyObject in touches { 

     let pointOfTouch = touch.location(in: self) 

     let nodeUserTapped = atPoint(pointOfTouch) 

     if nodeUserTapped.name == "BackButton" { 

      let sceneToMoveTo = SKScene(fileNamed: "GameOverScene") 
      let gameTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo!, transition: gameTransition) 

     } 

    } 

} 

ответ

4

В этом случае вы можете принять различные решения для достижения желаемого. Я хочу показать вам всего 2 примера, быстрый и простой способ и более индивидуальный подход.


1: - Вы можете использовать свойство userData экземпляра вашей следующей сцены, чтобы сохранить текущую сцену, что-то вроде:

sceneToMoveTo.userData = NSMutableDictionary() 
sceneToMoveTo.userData?.setObject("MenuScene", forKey: "previousScene" as NSCopying) 

и когда вы находитесь в следующей сцене, вы можете спросить к этому NSMutableDictionary, который предыдущая сцене, как:

guard let previousValue = self.userData?.value(forKey: "previousScene") else { return } 
switch previousValue as! String { 
case "MenuScene": 
    //do whatever you want if the previous scene was MenuScene 
default: 
    break 
} 

2: - Вы можете создать перечисление, которое содержит список сцен, в которые вы хотите переместить.

После этого каждая сцена содержит простой var для хранения предыдущей сцены: по умолчанию она равна .None, но вы должны заполнить ее, когда вы вызываете новую сцену. Когда вы приедете на SettingsScene и нажмите кнопку «Назад», вы можете задать этот previousScene var, который является предыдущей сценой, и решить, через инструкцию switch, куда идти.

// GAMEOVER SCENE 
import SpriteKit 
enum Scenes : Int { 
    case MainMenu = 0 
    case Settings = 1 
    case GameOver = 2 
    case None = 3 
} 
class GameOver: SKScene { 
    var previousScene:Scenes = .None 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch: AnyObject in touches { 
      let pointOfTouch = touch.location(in: self) 
      let nodeUserTapped = atPoint(pointOfTouch) 
      if nodeUserTapped.name == "settingsBtn" { 
       if let sceneToMoveTo = SKScene(fileNamed: "SettingsScene") { 
        let gameTransition = SKTransition.fade(withDuration: 0.5) 
        (sceneToMoveTo as! SettingsScene).previousScene = .GameOver 
        self.view?.presentScene(sceneToMoveTo, transition: gameTransition) 
       } 
      }  
     } 
    } 
} 
// SETTINGS SCENE 
import SpriteKit 
class SettingsScene: SKScene { 
    var previousScene:Scenes = .None 
    override func didMove(to view: SKView) { 
     print("Current scene loaded: \(type(of:self))") 
     print("Previous scene was: \(previousScene)") 
     let label = SKLabelNode.init(text: "BackButton") 
     addChild(label) 
     label.position = CGPoint(x:self.frame.midX,y:self.frame.midY) 
     label.name = "backBtn" 
    } 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch: AnyObject in touches { 
      let pointOfTouch = touch.location(in: self) 
      let nodeUserTapped = atPoint(pointOfTouch) 
      if nodeUserTapped.name == "backBtn" { 
       switch previousScene { 
       case .MainMenu: // go back to menu 
        if let sceneToMoveTo = SKScene(fileNamed: "MenuScene") { 
         let gameTransition = SKTransition.fade(withDuration: 0.5) 
         (sceneToMoveTo as! MenuScene).previousScene = .Settings 
         self.view?.presentScene(sceneToMoveTo, transition: gameTransition) 
        } 
        break 
       case .GameOver: // re-launch a new game 
        print("The game was ended") 
        if let sceneToMoveTo = SKScene(fileNamed: "GameScene") { 
         let gameTransition = SKTransition.fade(withDuration: 0.5) 
         (sceneToMoveTo as! GameScene).previousScene = .Settings 
         self.view?.presentScene(sceneToMoveTo, transition: gameTransition) 
        } 
       default: 
        break 
       } 
      } 

     } 
    } 
} 
//MENU SCENE 
import SpriteKit 
class MenuScene: SKScene { 
    var previousScene:Scenes = .None 
    override func didMove(to view: SKView) { 
     print("Current scene loaded: \(type(of:self))") 
     print("Previous scene was: \(previousScene)") 
    } 
} 
0

userData ваш друг здесь, это словарь, который можно найти на любом типе SKNode. Все, что вам нужно сделать, это сохранить текущую сцену, в которой вы находитесь, в userData и сделать переход. Это сохранит вашу текущую сцену в памяти. Поскольку ваша текущая сцена находится в памяти и не является частью дерева узлов новых сцен, на ней не будет вызываться метод обновления. По сути, у вас есть замороженное состояние сцены. Затем, когда вы будете готовы вернуться на сцену, просто вытащите экземпляр из пользовательских данных и представите его. Виола, вы перешли на свою сцену в тот момент, когда вы ее оставили раньше.

В принципе, если вы хотите, чтобы сцена возобновить, где она была прервана, выполните следующие действия:

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

    for touch: AnyObject in touches { 

     let pointOfTouch = touch.location(in: self) 

     let nodeUserTapped = atPoint(pointOfTouch) 

     if nodeUserTapped.name == "SettingButton" { 

      let sceneToMoveTo = SKScene(fileNamed: "SettingScene") 
      sceneToMoveTo.userData = ["previousScene":self.scene] 

      let gameTransition = SKTransition.fade(withDuration: 0.5) 
      self.view!.presentScene(sceneToMoveTo!, transition: gameTransition) 
     } 
    } 
} 

Затем, в любой момент вы хотите, чтобы вернуться к предыдущей сцене, просто добавьте следующее.

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

    for touch: AnyObject in touches { 

     let pointOfTouch = touch.location(in: self) 

     let nodeUserTapped = atPoint(pointOfTouch) 

     if nodeUserTapped.name == "BackButton" { 

      if let userData = self.userData, let previousScene = userData["previousScene"] as? SKScene 
      { 
       let gameTransition = SKTransition.fade(withDuration: 0.5) 
       self.view!.presentScene(previousScene, transition: gameTransition) 
      } 
     } 
    } 
} 
+0

Ранее я попросил (в более общем плане) о создании пользовательских переходов сцены. Можно ли использовать этот подход для хранения сцены для создания пользовательских переходов на сцену? – Confused

Смежные вопросы