ゲーム状態とその変更のフレームワークを仮実装してみた
pygameであみだくじゲームをするとき、綺麗にコードを分割したいから。
成果物
前回まで
SPACEキーで状態変化。ESCキーで終了。
概要
ゲーム状態
あみだくじゲームをつくる場合、以下の3つのゲーム状態がある。
状態 | ユーザ入力 | 表示 |
---|---|---|
選択 | 左右キーであみだ選択 | カーソル表示 |
アニメ | なし | 選択した線からゴールまでのアニメーション表示 |
結果 | SPACEキーで"選択"へ戻る | 選択した線の結果表示 |
各状態は、ユーザ入力や表示の内容が異なる。それぞれ別クラスで実装したい。そのための枠組みを考えた。デザインパターンでいうStateパターンを使ったつもり。
コード
def Run(self): pygame.init() if self.__title: pygame.display.set_caption(self.__title) clock = pygame.time.Clock() while 1: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit(); sys.exit(); elif event.type == KEYDOWN: if event.key == K_ESCAPE: pygame.quit(); sys.exit(); self.__stateSwitcher.State.Event(event) self.__stateSwitcher.State.Draw(self.__screen.Screen) pygame.display.flip() clock.tick(60) # 60 FPS
self.__stateSwitcher.State.Event(event)
で状態ごとのイベント処理をするself.__stateSwitcher.State.Draw(self.__screen.Screen)
で状態ごとの描画をする
メインの処理が上記のように簡潔に書ける。細かい実装は各Stateクラスで実装している。Stateクラスの生成とStateの切り換えはStateSwitcherクラスで行っている。
もしこの1関数内で全コードを書いたら大量のコードになる。if分だらけのネスト地獄になる。規模が大きくなるのでどうしても分割して書きたかった。
所感
pygameはまるで昔のWindowsAPIで実装しているかのような雰囲気。C言語的でありオブジェクト指向的ではない。ゲームのイベントドリブンな仕組みも自分で作らねばならなそう。
実装が大変だけど、変なフレームワーで固定されるよりはとっつきやすいか。Pythonやpygameに慣れるには丁度いいかも。