やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

ゲーム状態とその変更のフレームワークを仮実装してみた

pygameであみだくじゲームをするとき、綺麗にコードを分割したいから。

成果物

GitHubPygame.GameState.201707251432

f:id:ytyaru:20170725151458p:plainf:id:ytyaru:20170725151631p:plainf:id:ytyaru:20170725151639p:plain

前回まで

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言語的でありオブジェクト指向的ではない。ゲームのイベントドリブンな仕組みも自分で作らねばならなそう。

実装が大変だけど、変なフレームワーで固定されるよりはとっつきやすいか。Pythonpygameに慣れるには丁度いいかも。