タスク処理の設計
"タスク"というとコンピュータ業界ではとても抽象的で高度な処理と考えがちですが、ここでいうタスクとは「ゲーム上、実行する最も単純な処理」と位置付けます。
では、この実行とは何かというと、これはゲーム上で実行されるものであれば何でも良く、よくあるシューティングゲームでいえば自機となるシップ、アクションゲームでいえば主人公となるキャラクター、また画面上に表示される敵、敵の弾が"実行"されて動いています。
また、これらは画面上で目に見えたりしていますが、あまり意識しないもの等もタスクとして考えます。例えばフェードイン/アウトの処理、これも徐々に暗く(明るく)なっていく一つの「実行」となります。また、シューティングゲーム等によくある、「数秒後(数フレーム後)、もしくはある場所まで来たら、ボスを表示させる」というような処理も、ある意味「実行」の単位として扱うことができます。
ようは変化のあるもの('=, タスク)位と考えます。完成されたゲームをお手本によく分析してみると、変化のあるもの全てがタスクとして分解できると思います。
さて、ではどのようにタスクを実装するかというと、まずは基底クラスをタスク(実行単位)として表現し、ここから各実行すべきもの(自機等)を派生させる形となります。
雰囲気でいうと以下のような感じです。
単純なコーディング例(Java)
// 基底タスク // コンストラクタ // タスクの初期化 // タスク実行 // 例えば自機クラス(Taskクラスからの派生) |
これら実行すべきタスクとその派生クラスを設計したら、次はこれらをフレームワークとして実行する処理を検討します。
実行する処理は配列や、C++, Java, C# などのどの言語にも存在するコンテナを用いて集合管理し、この集合に登録されたタスクを一つずつ実行するという方法を実現すると、シンプルな実行処理を実現することができます。
具体的に説明すると、「集合管理された、基底クラス(タスククラス)から派生した実行処理クラス(自機等のクラス)の実行メソッドをポリモーフィズムにより動的に実行させる。」ということになります。
よくある面クリアタイプのゲームや、シューティングゲームを設計するとしたら、この方法が一般的かと思います。
この管理処理をメインループで呼び出せば、タスクの実行を行うことができます。
単純なコーディング例
// タスク管理 // 登録されているタスクの実行を行います // もしも消滅状態の場合はタスクを抹消します // タスクを実行します(ここでポリモーフィズムによる派生先のタスクが実行されます) |
まずは単純な説明はここまでとして、将来はこの基底クラス(基底タスク)からどのように、クラス派生を行うべきかを説明したいと思います。
« 昔のゲームの想い出 [0005] 「マリオブラザーズ」 [任天堂] [1983] [アーケード] l Home l Sample Action Gameの紹介 [ステージ1~5の宝箱攻略] »