第01章 便利なスプライト 次へ

ソース 実行ファイル
dx8_2d01.cpp dx8_2d01.exe

DirectX Graphicsには2D描画にとても便利なスプライト関数群があります。
これらの関数群を使えば2Dゲームは以前までのDirectXと同じくもしくはそれ以上に
簡単に作れます。(*速度的には若干難があります。)
また内部ではDirect3Dの機能を使用しているので
今まではサポートされていなかった回転・半透明が簡単に行えます。
もちろんハードウェア機能を使用しますので高速です(ビデオボードが対応していればの話ですけどね)

今回は単純に描画のみです。エフェクト機能は使用していません

出てくる関数:
関数名 詳細
IDirect3D8* D3DXCreateSprite(
LPDIRECT3DDEVICE8 /*IDirect3DDevice8 インターフェイスへのポインタ*/
LPD3DXSPRITE* /*作成されたスプライトを表す ID3DXSprite インターフェイスへのポインタのアドレス。*/ );
スプライト オブジェクトを作成する。
ID3DXSprite::Draw(
LPDIRECT3DTEXTURE8/*スプライトに使用するテクスチャへのポインタ*/
CONST RECT*/*テクスチャのどの部分をスプライトに使用するかを示す(NULLで全体)*/
CONST D3DXVECTOR2*/*スケーリング ベクトル*/
CONST D3DXVECTOR2*/*回転の中心を識別するポイント*/
FLOAT/*回転を指定する値*/
CONST D3DVECTOR2*/*平行移動*/
D3DCOLOR/*カラー チャネルとアルファ チャネル*/
);
スクリーン空間に単純なスプライトを描画する
LPDIRECT3D8 g_pD3D = NULL; LPDIRECT3DDEVICE8 g_pd3dDevice = NULL; LPDIRECT3DTEXTURE8 texture = NULL;//テクスチャ保持用 LPD3DXSPRITE m_pSprite = NULL;//スプライトオブジェクト HRESULT InitD3D( HWND hWnd ) { ・・変更無しの部分は省略します・・ // テクスチャ読み込み D3DXCreateTextureFromFileEx(g_pd3dDevice,"grp.png",0,0,0,0,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED, D3DX_FILTER_NONE,D3DX_FILTER_NONE,D3DCOLOR_ARGB(255,128,255,128),NULL,NULL,&texture); // スプライトオブジェクトの生成 D3DXCreateSprite(g_pd3dDevice, &m_pSprite); return S_OK; } //----------------------------------------------------------------------------- //描画処理 //----------------------------------------------------------------------------- VOID Render() { RECT ptn; if( NULL == g_pd3dDevice ) return; //画面全体を指定色でクリア g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); //BeginScene関数の後で始めて描画が出来る g_pd3dDevice->BeginScene(); //スプライト描画開始の合図 m_pSprite->Begin(); ptn.top=0; ptn.bottom=32; ptn.left=0; ptn.right=32; //実描画部分図 m_pSprite->Draw(texture, &ptn, NULL, NULL, NULL, &D3DXVECTOR2(64, 64),D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f)); //スプライト描画終了の合図 m_pSprite->End(); //EndScene関数で描画が終了 g_pd3dDevice->EndScene(); //裏画面から表画面へ転送 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } 今回のプログラムではtextureオブジェクトに読み込んだ画像をスプライトとして 左上の32*32の画像を表示しています。 次回はエフェクト機能を利用して色々な表示をしてみます。 尚、Beginを呼び出さずにDrawを呼び出すと暗黙的にBeginが呼ばれます。 その際当然連続的にDrawを呼ぶと大きなロスとなりますので気をつけてください。