Vim scriptによるゲームの新アーキテクチャの考察

従来のVim scriptによるゲーム作成時の問題点を解消する、 新しいアーキテクチャを考察してみました。

この記事は Vim script Advent Calendar 2015 の 13日目の記事です。

まずは以下のデモ画像(別ウィンドウ)を見てください。

capture

かなりスムーズに○リオが動いています。実はこれ、全部Vim scriptでできています。

ソースコードは koron/vim-ario に置いてありますので、チェックアウトして gvim -S game.vim することで試せます。ただし動作確認・保証は Windows版の +kaoriya な gvim でしかしておりません。また解像度も画面幅1920ドット無いとおかしなことになるので、異なる環境の場合は各自で調整してPRなどしてください。

操作は以下のとおりです。

  • h - 左ボタンのトグル
  • l - 右ボタンのトグル
  • f - ジャンプボタンのトグル
  • space - ボタン押下状態のクリア
  • esc - 終了

解説

従来、Vimでゲームを作成する際には以下の問題がありました。

  • キーレスポンスが悪い
  • 画面描画が遅い

両者は密接に関係しており、根本的には「ゲームループがスムーズに回らない」ことが原因となっていました。

そこでvim-arioでは、キー入力を受け付けるプロセスと(右上のgvim)、画面(キャラ)描画をするプロセス(○リオを表示しているgvim)と、ゲームループを回すプロセス(ウィンドウを最小化したgvim)をそれぞれ分けることで、それらの問題の解決を一気に試みました。結果として、Vimだけを用いて、60フレームに近い描画速度で、キー入力の遅延もほとんど感じさせずにキャラクタを操作できるようになっています。

現在はまだ1キャラの操作だけですが、同様の考え方を推し進め、キャラなど描画単位毎にプロセスを分け、ゲームループから制御することでより、スピーディーでダイナミックな本格的ゲームを作成する道筋が付いたと言えるでしょう。

現時点では他にも以下の問題がありますが、それらは今後の課題として研究が期待されます。

  • キー操作関連
    • key up取得方法の開発
    • 同時押し方法の開発
    • 操作の可視化
  • 実行環境毎の差異(画面サイズなど)の吸収
  • 効果音の出力

以上「Vim scriptによるゲームの新アーキテクチャの考察」でした。