ボタンをおしたらある画面にいきたいなど画面を変えるシーンをどのように実現するかを調べました。
前提
SpriteKitでは、いわゆる画面はSKScene classで表現されます。言い換えると、画面ごとにSKScene classを作ります。
(iOSが)やること
- ViewController.swiftで最初の画面が描いてあるSKScene classを呼び出す
- SKScene classでなにかをきっかけに次のSKScene classを呼び出す
書くのはclassから
コード
Hop, Step, Jump とタップするたびに画面遷移するコードを書きます。(シンプル!)
最初の画面を担当するHopScene classを書く
1画面モードでprojectを作ると以下のようなファイルができます。
ここに、HopScene.swiftを追加してHopSceneの画面の中身と、タッチしたときに次のclassに行く処理を書きます。
(が、次のclassをまだ書いて無いのでこのまま書くとXcodeに怒られるので、適宜コメントアウトしてclassを書いてからもどすなりなんなりする)
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とほぼ同じ。ほぼコピペなので、なんかもっとカッコよくかけよって感じもする。
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)
}
}
}
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を呼ぶ
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を入れておくとよい)