LoginSignup
14
20

More than 5 years have passed since last update.

SpriteKitで画面遷移を行う

Last updated at Posted at 2015-10-07

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

前提

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

ここに、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

14
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
20