ホーム < ゲームつくろー! < ゲーム製作技術編 < オブジェクト管理付きファクトリクラスの実装:サンプルプログラム
その4 オブジェクト管理付きファクトリクラスの実装:サンプルプログラム
ゲーム製作技術編その4「オブジェクト管理付きファクトリクラスの実装」で説明した内容を踏まえたサンプルプログラムです。実行すると青い画面が出現します。「1」キーを押すと回る丸いオブジェクトがどんどん増えます。「2」を押すと3種類の描き方になります(下の図は2番目の描き方です)。
サンプルスクリーンショット。半透明に描いた場合です。全部のキャラクタがくるくる回っています。
これらのオブジェクトはすべて個別のタスクが管理しています。タスクが持っているのは「テクスチャ情報」「スプライト情報」「描画位置情報」の3つです。すべてのタスクはデフォルトテクスチャをオブジェクトID0番で共有しています。「2」キーを押すと、システムはこのIDに別のテクスチャを入れます。これにより、すべての描画が一気に変わります。ここでタスクとシステムがオブジェクトIDを通してテクスチャを共有したことになります。
タスクは保持しているオブジェクトをオブジェクトファクトリからもらっています。それらオブジェクトの解放はファクトリクラスが受け持っているため、タスクはそれを気にする必要が一切ありません。ゲーム製作技術編その4の目的はそこです。
○ プログラムの実行方法
サンプルプログラムはこちらからダウンロードできます(GDEV_No4Smp.lzh(55.7kB))。プログラムは幾つかのヘッダーファイル(.h)と実装ファイル(.cpp)で構成されています。実行形式もありますので、まずは実行させて動作確認をしてみて下さい。
プログラム上から動かすには、空のWindowsアプリケーションを立ち上げ(プリコンパイル済みヘッダーははずしてください)、Sourceフォルダ内にある全てのファイルをプログラムフォルダ下にコピーした後、ヘッダーファイルと実装ファイルをプロジェクトに追加します。尚、各クラスはご自由にお使い下さって結構です。
○ ファイルの説明
・ maon.cpp
ウィンドウの作成やDirect3Dの初期化を行い、タスクシステムの初期化と更新を担います。
・ ObjectFactoryBase.h
オブジェクトファクトリの基本インターフェイスやテンプレートクラスが格納されています。このファイル内のインターフェイスを派生させるとファクトリマネージャに管理されるファクトリクラスが簡単に作成できます。
・ PosIno.h
位置情報を格納するクラスが定義されています。
・ SpriteFactory.h
ID3DXSpriteインターフェイスのファクトリクラスが定義されています。
・ SpriteTestTaskSystem.h
スプライト描画をするタスクシステムが定義されています。テストプログラムなのでシステムが色々と仕事を担っています。
・ TaskSystem.h
タスク及びタスクシステムの基本インターフェイスが定義されています。
・ TextureFactory.h
IDirect3DTexture9インターフェイスのファクトリクラスが定義されています。
・ comptr.h、smartptr.h
Comポインタ及びスマートポインタの定義が格納されています。
○ 動作チェックのポイント
「1」キーを押すと新規の描画タスクが生成されます(CSpriteTestTaskSystem::CreateSpriteTaskメソッド)。タスクは内部でスプライト、テクスチャそして位置情報オブジェクトをファクトリマネージャに生成してもらっています(CSpriteTestTask::Initメソッド)。ただしテクスチャはID=0で共有しています。生成したタスクはタスクシステムに登録されます(CSpriteTestTaskSystem::RegistTaskメソッド)。
「2」キーを押すとCSpriteTestTaskSystem::ChangeTextureメソッドが呼ばれます。このメソッド内ではテクスチャの切り替え作業を行っています。テクスチャファクトリに対してID=1〜ID=3にテクスチャをそれぞれ作成し、ID=0にテクスチャを順番に入れ替えます。ID=0のテクスチャはタスクが共有していますので、直ちに描画される絵が切り替わるわけです。尚、テクスチャIDと作成されるテクスチャ名は次の通りです:
ID テクスチャ名 0 (タスク共有ID) 1 Tex00.png 2 Tex01.png 3 Tex02.png
ファクトリクラスおよびファクトリマネージャはすべてシングルトンで実装されています。ファクトリクラスの基本クラスであるCObjectFactoryのコンストラクタでマネージャに対して自身を登録しています。ですから派生ファクトリクラスは登録に際して何も考えなくて大丈夫です。テンプレートで実装された2つのファクトリ基本クラス(CGeneralFactory<T>クラスとICOMObjectFactory<T>インターフェイス)は、それぞれ一般型及びCOMオブジェクトのファクトリクラスに化ける事ができます。一般型についてはテンプレートの型引数に任意型を設定するだけです。一方COMオブジェクトの場合はICOMObjectFactoryインターフェイスを継承し、生成部分を追加したクラスを作る必要があります。この実装例がCCOMSpriteFactoryクラスとCCOMTextureFactoryクラスにあります。
ファクトリクラスをテンプレート化した事で、わずらわしいオブジェクトの生成・削除作業が非常に簡単になります。特に削除については一切意識する必要はありません。
○ 注意
このプログラムはVisual Studio 2005+DirectXFeb2006で動作を確認しておりますが、他の環境では動かない可能性もあります。うまく動かない方は掲示板にてご連絡下さい。