2017-05-19 18 views
0

学校のプロジェクトでは、私は2Dゲームを作ることを任されています。ゲームは問題ありませんが、私はこの作業をするための特定のコードがあるかどうか疑問に思っていました。私はspriteKitを使用しているので、色のスプライトをクリックして前のシーンに戻ろうとしています。素早く色のスプライトをタップした後、前のシーンに戻る方法は?

これはばかげた質問ですが謝りますが、私はSwiftには少し戸惑っています。

種類よろしく、 ジェームズ

+1

ゲームビューコントローラでSKViewオブジェクトを表示する前のシーンはどのように定義されていますか? –

+0

[標準init(size :)初期化子を使用した遷移](http://stackoverflow.com/a/27935104/3402095)[fileNamedを使用した遷移:簡易初期化](http://stackoverflow.com/a/37394430/3402095) )、[どのノードがタップされたかを検出する](http://stackoverflow.com/a/41324936/3402095)、[カスタムボタンと委任パターン](http://stackoverflow.com/a/36524132/3402095)、最後にしかし少なくとも何か:[Stackoverflowについての良い質問をする方法](https://stackoverflow.com/help/how-to-ask)。 – Whirlwind

答えて

0

はあまりにも最も簡単な方法は、関連するSKSceneであなたのスプライト(S)上のタッチを検出することであるボタンを追加します。

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 
} 

再利用可能なソリューションでは、ボタンサブクラスを作成するのが理想的です。これを行う方法については、Googleにかなりのチュートリアルがあります。

SKScenes間の遷移よりも、各シーンでloadSceneメソッドを作成し、必要に応じてそれらを呼び出すよりも、これはここで

+0

ありがとう、私の問題を解決しました:) – James

+0

あなたは大歓迎です。ハッピーコーディング。 – crashoverride777

+0

私はSpriteKitでのタッチ操作の簡単な例を使って、私の答えにいくつかの詳細を追加しました。 – crashoverride777

1

を助け

// 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: ...) 
    } 
} 

希望はあなたが色のスプライトを使用して、ボタンを作成する方法の一例です。タッチイベントを受け取るためのボタンを設定する方法と、それらのタッチイベントを使用してシーン間をナビゲートする方法を示します。

この例では、新しいシーンに移動して前のシーンに戻ることができます。

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

ありがとうございます! – James