LoginSignup
2
2

More than 5 years have passed since last update.

【GameplayKit】iOSゲームアプリにおけるStateパターン実践 Part_6

Last updated at Posted at 2016-12-26

前回の記事

【GameplayKit】iOSゲームアプリにおけるStateパターン実践 Part_5では、ステートマシンによるステート遷移に分岐構造を実装しました。

この記事について

今回は、ステートパターンとはあまり関係がなくなってしまうかもしれませんが、SpriteKitのレンダリング概念について実践しながら理解していきます。
ここまでの記事で、「給水機は満タン > 給水 > タンク水量が減少 > カラ状態」までをステート遷移できるようになりました。さらに、それぞれのアニメーションはスプライトノードのアクション機能を使用して実現しました。
この記事では、給水機がカラ状態EmptyStateになった後に補給(リフィル)されて、タンク水量が増加していく様をレンダリングします。

手順

大まかな流れは以下のようになります。
給水機の表示ランプを点滅させる

給水機の表示ランプを点滅させる

タンクが空になったら、表示ランプをチカチカ点滅させます。

EmptyState
class EmptyState: DispenserState {

    var flashTimeCounter: TimeInterval = 0
    static let flashingInterval: TimeInterval = 0.6

    var lightOn = true {
        didSet {
            let color = (lightOn ? SKColor.red : SKColor.black)
            changeIndicatorLightToColor(color)
        }
    }

    ...

    override func update(deltaTime seconds: TimeInterval) {
        flashTimeCounter += seconds

        if flashTimeCounter > EmptyState.flashingInterval {
            lightOn = !lightOn
            flashTimeCounter = 0
        }
    }

}

flashTimeCounterプロパティは経過時間を計測します。
flashingIntervalプロパティは点滅させる間隔です。
lightOnプロパティは計算プロパティです。
update(deltaTime)メソッドは、ゲームシーンのフレームが描画されるたびに実行されます。

ゲームシーンのレンダリング

シーンのupdateメソッドで、ステートマシンのupdate(deltaTime)メソッドを呼び出します。

GameScene.swift
class GameScene: SKScene {

    var stateMachine: GKStateMachine!
    var previousUpdateTime: TimeInterval = 0

    override func didMove(to view: SKView) {
        ...
    }

    override func update(_ currentTime: TimeInterval) {
        let timeSincePreviousUpdate = currentTime - previousUpdateTime

        stateMachine.update(deltaTime: timeSincePreviousUpdate)
        previousUpdateTime = currentTime
    }

    ...

}

updateメソッドでは、最後に描画更新した日時と現在日時の差分(どれくらい時間が経ったか)を引数にしてステートマシンに渡しています。

ビルド

シミュレータでビルドします。
EmptyStateになるまで給水をして、タンクを空にします。
給水機の表示ランプが0.6秒ごとに点滅することが確認できます。

次回

【GameplayKit】iOSゲームアプリにおけるStateパターン実践 Finalでは、ステートマシンの挙動を完成させます。

2
2
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
2
2