0からのゲームプログラミング > インターフェイス

Back Next
更新日 2003.11.08
インターフェイス

 DirectX SDK から提供されているものに、インターフェイス (Interface) と呼ばれるものがあります。これから使っていきますが、例えば、IDirect3DDevice9 インターフェイスID3DXSprite インターフェイス 等があります。インターフェイスの名前は、最初の文字が大文字の I で始まる名前が付けられています。

 C++ のクラス内の関数は、メンバ関数と呼ばれていました。インターフェイスにも関数があり、インターフェイスから提供されている関数を、特にメソッドと呼びます。


 これらのインターフェイスの使い方は、クラスの使い方とだいたいは同じです。但し、注意しなければならないことがあります。クラスでは、普通にクラスオブジェクトを宣言して使用することが出来ました。

 しかし、インターフェイスの使い方は、まずインターフェイスへのポインタを宣言して、そのポインタに、DirectX SDK から提供されている関数を使って、そのインターフェイスへのアドレスをセットします。インターフェイスへのポインタが必要なくなったら、大抵は Release メソッド を呼び出し、メモリを解放します。厳密には、Release メソッドを呼び出したタイミングでメモリが解放されるとは限らず、内部では参照カウントで管理されています。詳しくは、IUnknown インターフェイス を参照して下さい。


 初期化と解放を注意しさえすれば、インターフェイスはクラスと同じように使えます。Release を呼び忘れると、Release 忘れという深刻なバグになります。Release を呼び忘れたからといって、直ぐにプログラムが落ちないことが多い為、バグを発見しにくくなります。デバッグ ランタイム をインストールしておけば、Release 忘れは、デバッグ ウィンドウ に表示されます。


 さて、今度は WinMain.cpp の
// グローバルオブジェクト & 変数 & ポインタ
と書かれたところを見て下さい。そこでは、以下のように書かれたコードがあります。
 

LPDIRECT3DDEVICE9			g_pD3DDevice = NULL;
LPD3DXSPRITE			g_pSprite = NULL;

 LPDIRECT3DDEVICE9LPD3DXSPRITE は、それぞれ、IDirect3DDevice9 へのポインタID3DXSprite へのポインタ、を意味します。これらは、DirectX SDK で提供されているヘッダに定義されています。


 IDirect3DDevice9 は、デバイス装置、外部周辺機器)関係を管理するインターフェイスであり、ID3DXSprite は、スプライト2Dの画像を高速に表示する技術)の処理をするインターフェイスです。

 IDirect3DDevice9 と ID3DXSprite インターフェイスの初期化と解放は、スケルトンプログラム側で適切に行っており、アプリケーションが正常に起動されれば、g_pD3DDevice と g_pSprite には、NULL 以外の値が格納されるようにしています。後は、g_pD3DDevice と g_pSprite を使って、それぞれのメソッドを呼び出すだけです。


 また、g_pD3DDevice、g_pSprite の変数名(インターフェイスへのポインタ名)を他の名前に変えたい場合には、必要な箇所全てを置換すれば変更は可能です。


 それでは、ScreenStage.cpp 内の CScreenStage::Draw を見て下さい。
 

// 描画
// 引数、戻値なし。
void CScreenStage::Draw(void)
{
	// 画面クリア
	g_pD3DDevice->Clear(0, NULL, g_pFormat->GetFlags(), D3DCOLOR_XRGB(0, 0, 0), 1.0, 0);

	// 描画開始
	g_pD3DDevice->BeginScene();


	// スプライト描画開始
	g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);


	// スプライト描画
	g_pSprite->Draw(m_Texture, NULL, NULL, NULL, 0xffffffff);


	// スプライト描画終了
	g_pSprite->End();


	// 描画終了
	g_pD3DDevice->EndScene();

	// 画面更新
	g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

 描画関数 Draw の最初で、画面クリア描画開始のコードを記述しており、最後で、描画終了画面更新のコードを記述しています。これは、お決まりのパターンだと思って頂いて構いません。後でまた取り上げるかも知れませんが、各メソッドの詳細はヘルプを参照して下さい。そして、描画コードは、それらの間に記述します。


 スプライトを使う際には、最初に ID3DXSprite::Begin メソッド を呼び出し、最後に ID3DXSprite::End メソッド を呼び出します。これもお決まりのパターンです。結局のところ、描画コードは、以下の一つの文を書くだけです。
 

	// スプライト描画
	g_pSprite->Draw(m_Texture, NULL, NULL, NULL, 0xffffffff);


 今回、画像を動かしてみようかと思っておりましたが、長くなりましたので次回に回します。ID3DXSprite::Draw メソッドの詳細も次回以降やります。


 最初は、2Dゲームを創っていきますが、2Dゲームが自由に創れるようになれば、3Dゲーム作成への移行もそれ程難しくありません。

【スポンサード リンク】


Back Next

0からのゲームプログラミング > インターフェイス