Hello World / plɹoM ollǝH

Programmers Live in Vain

Pythonゲームプログラミング #7 ステートマシン

gist消してしまったので
代わりにこのリポジトリを参考にしてください

#0 環境構築
#1 メインループ
#2 画像表示
#3 アニメーション
#4 キー入力
#5 サウンド
#6 衝突判定
#7 ステートマシン
#8 マップチップ
#9 スクロール

ステートマシン

pygameを使ったゲームプログラミングについて説明していきます。

  • Windows10
  • Python3.6.1
  • pygame1.9.3

今回はステートマシンです。

ステートマシンって何?

簡単にいうと「状態(ステート)によって振る舞いを変化させたり、状態を遷移させる仕組み」のことです。 この仕組みをゲームプログラミングにうまく適用することで、複雑なプログラムも簡潔に書けるようになり、バグも減ります。

例えば、ゲームに時限爆弾を登場させたいときには「爆発まで待機する状態」「爆発している状態」「爆発が終わった状態」などが考えられます。 それぞれの状態では再生されるアニメーションもバラバラでしょうし「爆発の待機中はキャラクターが重ならないようにあたり判定を付けたい」 「爆発したときは攻撃のあたり判定を発生させたい」「爆発が終わったらゲームから消去したい」などの、状態の遷移と紐づいた様々な処理を実装する必要が出てきます。

f:id:dungeonneko:20170517215503p:plain

これを真面目にif文などで実装してしまうととても複雑なプログラムになってしまうので 「状態Aに入ったときの処理」「状態Aのあいだ呼ばれる処理」「状態Aから出ていくときの処理」などを関数で定義できるようにして、どの処理がいつ呼ばれるかはステートマシンクラスに管理させることにします。

サンプルコード

実行結果

待機ステート開始
爆発まであと90フレーム
爆発まであと89フレーム
爆発まであと88フレーム
.
.
.
爆発まであと3フレーム
爆発まであと2フレーム
爆発まであと1フレーム
待機ステート終了
爆発ステート開始
爆発アニメーションの終了待ち
爆発アニメーションの終了待ち
爆発アニメーションの終了待ち
爆発ステート終了
全ての処理が終了

ゲームオブジェクトだけでなくAIや

f:id:dungeonneko:20170517222616p:plain

シーン遷移などにもステートマシンを適用させることが可能です

f:id:dungeonneko:20170517222629p:plain