2017-05-19 1 views
0

Donc, pour un projet d'école, j'ai été chargé de faire un jeu en 2D. Le jeu est bien, mais je me bats avec la façon de faire un bouton de retour (Au milieu de la page) alors je me demandais s'il y avait un code spécifique pour faire ce travail. J'utilise spriteKit donc j'essaie de revenir à la scène précédente après avoir cliqué sur un sprite de couleur. Je m'excuse si c'est une question stupide mais je suis un peu nouveau à Swift.Comment revenir à la scène précédente après avoir appuyé sur un sprite de couleur dans swift?

Cordialement, James

+1

Comment la scène précédente est-elle définie dans votre contrôleur de vue de jeu? –

+0

[Transition à l'aide de l'initialiseur init (size :) standard] (http://stackoverflow.com/a/27935104/3402095), [Transition à l'aide de fileNamed: initialiseur de commodité] (http://stackoverflow.com/a/37394430/3402095), [Détecter quel nœud est exploité] (http://stackoverflow.com/a/41324936/3402095), [Bouton personnalisé et modèle de délégation] (http://stackoverflow.com/a/36524132/3402095), et dernier mais pas des moindres: [Comment poser une bonne question sur Stackoverflow] (https://stackoverflow.com/help/how-to-ask). – Whirlwind

Répondre

0

ajouter un bouton trop la façon la plus simple est de détecter des touches sur votre sprite (s) dans le SKScene concerné.

enum NodeName: String { 
    case coloredSprite1 
    case coloredSprite2 
} 

class GameScene: SKScene { 

    let coloredSprite = SKSpriteNode(imageNamed: "YourImageName") 

    /// Scene setup 
    override func didMove(to view: SKView) { 
     // set up your colored sprite if necessary 
     // Give your sprites unique names to identify them 

     coloredSprite.name = NodeName.coloredSprite1.rawValue // always use enums for things like string identifiers so you avoid typos 
    } 

    /// Touches 
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     for touch in touches { 
      let location = touch.location(in: self) 
      let touchedNode = atPoint(location) 

      // Way 1 by node (probably less preferable) 
      switch touchedNode { 
      case coloredSprite: 
       // do something (e.g call loadScene method) 
       // see below 
      default: 
       break 
      } 

      // Way 2 by node name (probably more preferable) 
      // name is an optional so we have to unwrap it when using it in the switch statement. 
      // The easiest way is by providing an alternative string, by using the nil coalescing operator (?? "NoNodeNameFound") 

      switch touchedNode.name ?? "NoNodeNameFound" { 
      case NodeName.coloredSprite1.rawValue: 
       // do something (e.g call loadScene method) 
       // see below 
      default: 
       break 
      } 
     } 
    } 

    // Also call touchesEnded, touchesMoved and touchesCancelled and do necessary stuff 
} 

Pour une solution plus réutilisable, vous souhaitez idéalement créer une sous-classe de boutons. Il y a quelques tutoriels à google sur la façon de le faire.

Pour effectuer une transition entre SKScenes, vous pouvez créer une méthode loadScene dans chaque scène et les appeler si nécessaire.

// Start Scene 
class StartScene: SKScene { 
    ... 

    func loadGameScene() { 

     // If you do everything in code 
     let gameScene = GameScene(size: self.size) 
     view?.presentScene(gameScene, transition: ...) 

     // If you use SpriteKit scene editor 
     guard let gameScene = SKScene(fileNamed: "GameScene") else { return } // fileNamed is the name you gave the .sks file 
     view?.presentScene(gameScene, transition: ...) 
    } 
} 

// Game scene 
class GameScene: SKScene { 
    .... 

    func loadStartScene() { 
     // If you do everything in code 
     let startScene = StartScene(size: self.size) 
     view?.presentScene(startScene, transition: ...) 

     // If you use SpriteKit scene editor 
     guard let startScene = SKScene(fileNamed: "StartScene") else { return } // fileNamed is the name you gave the .sks file 
     view?.presentScene(startScene, transition: ...) 
    } 
} 

Hope this helps

+0

Merci beaucoup, résolu mon problème :) – James

+0

Vous êtes les bienvenus. Codage heureux. – crashoverride777

+0

J'ai ajouté quelques détails à ma réponse avec un exemple simple sur la façon de faire des touches dans SpriteKit. – crashoverride777

1

Voici un exemple de la façon dont vous pouvez créer un bouton à l'aide d'un sprite de couleur. Il montre comment vous pouvez configurer un bouton pour recevoir des événements tactiles et comment vous pouvez utiliser ces événements tactiles pour naviguer entre les scènes.

Dans cet exemple, vous pouvez naviguer vers de nouvelles scènes et revenir aux scènes précédentes. Comment la scène précédente définie dans votre contrôleur de vue de jeu affiche-t-elle l'objet SKView?

import SpriteKit 

class Button: SKSpriteNode { 

    var tapped: (() -> Void)? 

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

} 

class GameScene: SKScene { 

    var parentScene: SKScene? 
    var sceneCount = 1 

    override func didMove(to view: SKView) { 
     if parentScene != nil { 
      let backButton = addButton(color: .red, position: CGPoint(x: -200, y: 0)) 
      backButton.tapped = { 
       if let previousScene = self.parentScene { 
        view.presentScene(previousScene) 
       } 
      } 
     } 

     let nextButton = addButton(color: .blue, position: CGPoint(x: 200, y: 0)) 
     nextButton.tapped = { 
      if let nextScene = SKScene(fileNamed: "GameScene") as? GameScene { 
       nextScene.scaleMode = self.scaleMode 
       nextScene.parentScene = self 
       nextScene.sceneCount = self.sceneCount + 1 
       view.presentScene(nextScene) 
      } 
     } 

     let label = SKLabelNode(text: "Scene \(sceneCount)") 
     addChild(label) 
    } 

    func addButton(color: SKColor = .white, position: CGPoint = .zero) -> Button { 
     let button = Button(color: color, size: CGSize(width: 200, height: 200)) 
     button.position = position 
     button.isUserInteractionEnabled = true 
     addChild(button) 
     return button 
    } 

} 
+0

Merci beaucoup! – James