LoginSignup
37
33

More than 5 years have passed since last update.

Swift シーン管理クラスを使ってゲーム画面を遷移させる

Last updated at Posted at 2015-03-30

タイトル画面 → ゲーム画面 → 結果画面 の画面遷移を、シーン管理クラスを使って実装してみました。自分用のメモです。

GameViewController.swift
class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let gameView = GameView(frame: self.view.frame)
        self.view = gameView        
    }

・シーンを管理するクラス

SceneManager.swift
import Foundation
import SpriteKit

class SceneManager: NSObject {

    //タイトルシーン
    class func titleScene(size: CGSize) -> TitleScene {
        let scene = TitleScene(size: size)
        return scene
    }

    //ゲームシーン
    class func gameScene(size: CGSize) -> GameScene {
        let scene = GameScene(size: size)
        return scene
    }

    //結果シーン
    class func resultScene(size: CGSize) -> ResultScene {
        let scene = ResultScene(size: size)
        return scene
    }

    //シーン切り替え
    class func changeScene(view: SKView, New newScene: SKScene, Duration sec: NSTimeInterval) {
        let transition = SKTransition.fadeWithDuration(sec)
        view.presentScene(newScene, transition: transition)
    }
}

・タイトル画面

TItleScene
import Foundation
import SpriteKit

class TitleScene: SKScene {

    var changeSceneDelegate: ChangeSceneProtocol!

    override func didMoveToView(view: SKView) {

        self.backgroundColor = UIColor.orangeColor()

        println("TitleScene")

        let label = SKLabelNode()
        label.text = "Title Scene"
        label.fontSize = 50
        label.fontColor = UIColor.blackColor()
        label.position = CGPoint(x: self.frame.width/2.0, y: self.size.height/2.0)
        self.addChild(label)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        changeSceneDelegate.changeScene(self.scene!)
    }
}

・ゲーム画面

GameScene.swift
import Foundation
import SpriteKit

class GameScene: SKScene {

    var changeSceneDelegate: ChangeSceneProtocol!

    override func didMoveToView(view: SKView) {

        self.backgroundColor = UIColor.yellowColor()

        println("GameScene")

        let label = SKLabelNode()
        label.text = "Game Scene"
        label.fontSize = 50
        label.fontColor = UIColor.blackColor()
        label.position = CGPoint(x: self.frame.width/2.0, y: self.size.height/2.0)
        self.addChild(label)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        changeSceneDelegate.changeScene(self)
    }
}

・結果画面

ResultScene.swift
import Foundation
import SpriteKit

class ResultScene: SKScene {

    var changeSceneDelegate: ChangeSceneProtocol!

    override func didMoveToView(view: SKView) {

        self.backgroundColor = UIColor.greenColor()

        println("ResultScene")

        let label = SKLabelNode()
        label.text = "Result Scene"
        label.fontSize = 50
        label.fontColor = UIColor.blackColor()
        label.position = CGPoint(x: self.frame.width/2.0, y: self.size.height/2.0)
        self.addChild(label)
    }

    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        changeSceneDelegate.changeScene(self)
    }
}

・画面遷移プロトコル

ChangeSceneProtocol.swift
import Foundation
import SpriteKit

protocol ChangeSceneProtocol {
    func changeScene(scene: SKScene)
}

・シーンを表示するビュー

GameView.swift
import Foundation
import SpriteKit

class GameView: SKView, ChangeSceneProtocol{
    override init(frame: CGRect) {
        super.init(frame: frame)
        setUpGameView()
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    //初期画面を設定
    func setUpGameView() {
        switchingTitleScene()
    }

    //タイトルシーンへ切り替え
    func switchingTitleScene() {
        let scene = SceneManager.titleScene(self.bounds.size)
        scene.changeSceneDelegate = self
        SceneManager.changeScene(self, New: scene, Duration: 0.5)
    }

    //ゲームシーンへ切り替え
    func switchingGamaScene() {
        let scene = SceneManager.gameScene(self.bounds.size)
        scene.changeSceneDelegate = self
        SceneManager.changeScene(self, New: scene, Duration: 0.5)
    }

    //結果画面へ移動
    func switchingResultScene() {
        let scene = SceneManager.resultScene(self.bounds.size)
        scene.changeSceneDelegate = self
        SceneManager.changeScene(self, New: scene, Duration: 0.5)
    }

    //デリゲートメソッド
    func changeScene(scene: SKScene) {
        if scene.isKindOfClass(TitleScene) {
            switchingGamaScene()
        } else if scene.isKindOfClass(GameScene) {
            switchingResultScene()
        } else if scene.isKindOfClass(ResultScene) {
            switchingTitleScene()
        }
    }
}
37
33
4

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
37
33