Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

前回の記事

【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では、ステートマシンの挙動を完成させます。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away