SpriteKitで画面遷移を行う

ボタンをおしたらある画面にいきたいなど画面を変えるシーンをどのように実現するかを調べました。

## 前提
SpriteKitでは、いわゆる画面はSKScene classで表現されます。言い換えると、画面ごとにSKScene classを作ります。

## （iOSが）やること
1. ViewController.swiftで最初の画面が描いてあるSKScene classを呼び出す
2. SKScene classでなにかをきっかけに次のSKScene classを呼び出す
書くのはclassから

## コード
Hop, Step, Jump とタップするたびに画面遷移するコードを書きます。（シンプル！）

### 最初の画面を担当するHopScene classを書く
1画面モードでprojectを作ると以下のようなファイルができます。
![76adf8f823e565b936135c5e0b3b6da7.png](https://qiita-image-store.s3.amazonaws.com/0/32555/3a46911f-5855-f789-d1df-bb78c77a5990.png)

ここに、HopScene.swiftを追加してHopSceneの画面の中身と、タッチしたときに次のclassに行く処理を書きます。
（が、次のclassをまだ書いて無いのでこのまま書くとXcodeに怒られるので、適宜コメントアウトしてclassを書いてからもどすなりなんなりする）

``` HopScene.swift
import SpriteKit

class HopScene: SKScene{
    override func didMoveToView(view: SKView) {
//この画面に来たときにHopって書いてあるラベルを配置
        let label = SKLabelNode()
        label.text = "Hop"
        label.position = CGPoint(x:100,y:70)
        self.addChild(label)        
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if let _ = touches.first as UITouch? {
//タッチを検出したときにStepSceneを呼び出す
            let scene = StepScene(size: self.scene!.size)
            scene.scaleMode = SKSceneScaleMode.AspectFill
            self.view!.presentScene(scene)

        }
    }
}
```

### StepScene class, JumpScene class を作る
やってることはHopScene.swiftとほぼ同じ。ほぼコピペなので、なんかもっとカッコよくかけよって感じもする。

``` StepScene.swift
import SpriteKit

class StepScene: SKScene{
    override func didMoveToView(view: SKView) {
        let label = SKLabelNode()
        label.text = "Step"
        label.position = CGPoint(x:100,y:70)
        self.addChild(label)
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if let _ = touches.first as UITouch? {
            let scene = JumpScene(size: self.scene!.size)
//呼び出すSceneをJumpScene classにしただけ
            scene.scaleMode = SKSceneScaleMode.AspectFill
            self.view!.presentScene(scene)
        }
    }
}
```


```JumpScene.swift
import SpriteKit

class JumpScene: SKScene{
    override func didMoveToView(view: SKView) {
        
        let label = SKLabelNode()
        label.text = "Jump"
        label.position = CGPoint(x:100,y:70)
        self.addChild(label)
        
    }
    
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        if let _ = touches.first as UITouch? {
            let scene = HopScene(size: self.scene!.size)
            scene.scaleMode = SKSceneScaleMode.AspectFill
            self.view!.presentScene(scene)
        }
    }
}
```

### ViewController.swiftで最初のSKScene classを呼ぶ


```ViewController.swift
import UIKit
import SpriteKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        //HopSceneを呼ぶ
        let view = self.view as! SKView
        let scene = HopScene()
        scene.size = view.frame.size
        view.presentScene(scene)
    }
}
```

初期状態では、self.viewはSKViewになって無いので怒られるので、
Main.storyboardでClassをSKView classにする。
（選択肢にはでてこないので手打ちする。選択肢に出したいときにはLinked FrameworkにSpriteKit.frameworkを入れておくとよい）

![Main_storyboard.png](https://qiita-image-store.s3.amazonaws.com/0/32555/62ac517a-5a0d-2c03-9cee-5b316086995f.png)