gl5_progのメモ

自分のためのメモとかまとめとか

Luaコルーチンだけでゲームオブジェクトを記述してみる

問題

Luaのコルーチンを使うと状態の遷移をとてもシンプルに書くことができます。 コルーチンの中断により、プログラム位置やローカル変数が保存されるので、わざわざオブジェクトのメンバ変数としてそれらを保存しておく必要がなくなるからです。 しかし、ゲームのオブジェクトは状態の遷移(更新処理)だけでなく描画処理も必要だったりします。 描画処理では状態によって描画内容を変えたいことがよくあるので、結局、状態を表すメンバ変数が必要になります。 また、これは描画処理だけの問題ではなく、ゲームオブジェクトへのアクセス(たとえばスコアの取得)についても同じことが言えます。ゲームオブジェクトとして存在しているのはコルーチンだけです。コルーチンへのアクセスはresumeくらいしかありません。コルーチンだけでなく状態を表すメンバ変数が必要なのでしょうか。 なんとかしてメンバ変数を持たずにすむ方法は無いでしょうか。

解決案

resumeに引数を渡して、それに応じて処理を変える。

わかりにくい実装コード

まず、resumeに渡す引数の意味を決めました。

JobType = { Update=1, Draw=2, GetScore=3 }

resumeで渡ってきた引数が

  • JobType.Updateなら更新処理
  • JobType.Drawなら描画処理
  • JobType.GetScoreならスコア値の取得

という風にコルーチンを実装します。

実装する際の注意点として、Update以外ではコルーチンのプログラム位置が変わらないようにしなければならないということです。 今回はYieldをラップして、Update以外なら、またすぐにYieldに入るようにすることでプログラム位置を変えないようにしました。

最後に

これでコルーチンだけでゲームオブジェクトが記述できるような気がします。 しかし、この方法が状態の変数を持つ場合に比べて楽なのかどうかはまだわかりません…。