キャラ管理ライブラリを考える

発想の原点は、キャラの移動やアニメーションをライブラリ側で管理して、勝手に動くモノを制御するためのスクリプトをユーザーが書く、ということ。
昔、ラグナロクオンラインホムンクルスのAI(Luaで書く)を作ったことがあって、あれはあれで非常に使いにくかったが、可能性として面白いと感じた。
ラグナロクの場合は、ホムンクルスに移動や攻撃の命令を出すと、非同期で行動し始める。
それらのステータスをチェックしながら、周りの状況などを見つつ、次の行動を指示していく。
ぶっちゃけ、リアルタイムハードウェア制御に近いものがある。
現在位置をGPSで取得して、各種センサーの入力で外部と自分の状態をチェック、状態遷移しながら行動を選択してくわけだ。
移動命令を発行しても、障害物に引っかかるかもしれないし、敵にしばかれて止まるかもしれない。
そういう可能性を、逐一確認しながら制御する。
こういうものを非同期で作ると思い通りに動かすのが大変難しくなるから、ゲーム用フレームワークとして考えるなら同期型で作るのが望ましい。
そして、ゲーム用フレームワークとして同期型で作られているのが、これまたLua採用のAIMSというかんじだ。


そういったライブラリを使うメリットは、キャラの移動の管理をする必要がなくなること、それから、同時に描画やアニメーション、衝突判定まで組み込んでしまえば、ゲームを作るために必要なコードが大幅に減るということだ。
AIMSはそのレベルのものであり、DXRubyでゲームを作る場合と比較すると、書かなければならないコード量は恐らく圧倒的に少ない。
フレームワークだから習得には少し時間がかかるだろうが、C側で処理できる速度的メリットも考えると、こういうものを考える価値はある。


AIMSは汎用的ではない。
色んな部分で潔い割り切りをしている。
Lunaを使っているのだから、それをそのまま出せば最も汎用的なライブラリは作れるのだが、そうしていないのは、何かに特化したフレームワークにすることで、使い方を簡単にしたかったからだろう。
DXRubyはかなり汎用的に作ってある。
そのため、シンプルなミニゲームを作る程度なら便利だが、大規模・本格的なゲームを作ろうと思うと、まず基本部分から設計していかないといけない。
そういうのが好きな人ならそれでいいのだが、そうでない人ももちろんいるわけで、そうでない人はDXRubyには見向きもしないだろう。
俺としてはDXRubyは汎用の基本部分のみのライブラリとしたいから、何らかのフレームワークを作るとしたら、それは周辺ライブラリということになる。
統合してしまえばそれはそれで色々といい事もあるのだが、どうも乗り気ではない。


具体的イメージとしては、やっぱりAIMSに近いものになってくる。
サンプルシューティングの雛形を抜き出して、扱いやすくして機能を強化する感じだろうが、それはかなりAIMSに近いのだ。
AIMSの用語を使うなら、Actorクラスを継承してキャラクラスを作り、そこからオブジェクトを生成して、そいつに移動命令を与えてレイヤに登録しておけば、後は勝手に動く感じ。
衝突判定はDXRubyExtension的に、当たっていたらメソッドが呼ばれる。
毎フレームRubyのメソッドを呼ぶ必要があるオブジェクトは、メソッドを登録しておけば呼んでくれる。
移動命令にメソッド名もついでに渡しておけば、移動完了時に呼んでくれる、とか。
シンプルなものなら極力簡単に作れて、複雑なものにも対応できるようなのが望ましい。
そして、必要なければRubyの処理はできる限り呼ばない。
俺がフレームワークを作ろうと考えるのは、ゲームを作るのを簡単にする以上に、速度的にネックになっているRuby処理を減らす必要性を感じているからだ。
とりあえず目標はサンプルシューティング+α程度をもっと簡単に作れて、もっと高速に動かせるようなもの。
サンプルシューティングをそれ用に作り直して検証しよう。
他のタイプのゲームも作ってみたけど、絵がねぇ〜