DirectXプログラミング講座 〜Vol4. 2Dポリゴンの表示〜

D3Dデバイスの生成が成功したら、早速物体を描画してみましょう。その前に、DirectXを利用した描画方法には、2Dと3Dの2通りの手段があります。ご存知の通り、2Dとは平面のイメージをそのままディスプレイに表示する手法であり、3Dとは擬似的に3次元空間を作り出してあたかもディスプレイの中に奥行きができたかのように演出する手法です。このステップでは、表現が簡単な2Dの物体描画を解説します。


CImage2Dクラス 〜物体はオブジェクトとして管理する〜

2D、3Dに関係なく、何らかの物体はオブジェクトという単位で管理する点を常に心掛けましょう。例えば、シューティングゲームでは、「自機・敵機・弾」などがオブジェクトになりえる対象となります。「オブジェクト指向」に挑戦するのが初めてだという方、頭を柔らかくしてあまり心配せずに読み進めてみましょう。

さて、本題ですが、2Dイメージのオブジェクトとして最も簡単な四角形の描画にチャレンジしてみます。ABDXのCImage2Dクラスを利用すれば四角形をベースに2Dイメージを簡単に扱うことができます。CImage2DオブジェクトはInitProc関数の中で生成、QuitProc関数の中で破棄すると良いでしょう。描画を行うにはRenderProc関数の中でDrawメンバ関数を呼び出します。また、必要に応じて任意のタイミングでSetColorメンバ関数を呼び出して四角形オブジェクトの色を設定することもできます。


'四角形オブジェクトの色を設定します
CImage2D::SetColor(
    dwColor As D3DCOLOR   '四角形オブジェクトの色(D3DCOLOR_XRGBマクロ関数を利用する)
)

'四角形オブジェクトを描画します(RenderProc関数の中から呼び出す必要があります)
CImage2D::Draw(
    x As Single,          '四角形左端上のX座標
    y As Single,          '四角形左端上のY座標
    width As Single,      '四角形の幅
    height As Single      '四角形の高さ
)

'D3DCOLOR型のRGB値を返します
D3DCOLOR_XRGB(
    r,                    '色の赤成分を0〜255の範囲で指定します
    g,                    '色の緑成分を0〜255の範囲で指定します
    b                     '色の青成分を0〜255の範囲で指定します
)

※次の章では更にSetTextureメンバ関数を利用してテクスチャの貼り付けを行っています。

サンプルプログラムの作成方法


↑実行イメージ

サンプルプロジェクトtest2dをダウンロード

DirectXアプリケーションのプロジェクトを新たに作成します。プロジェクト名はtest2dとでもしておきましょう。test2d.abpには必要最低限のソースコードが自動生成されているので、そこに処理を追加する形でコーディングを行います。

●test2d.abpの先頭部分のコーディング

先頭部分にはアプリケーションで利用するグローバル変数を定義します。ここでは、CImage2Dクラスポインタ型の変数pImageObjを定義するため、以下のようにコードを追加します。ScreenX、ScreenY変数はディスプレイ解像度を示す値になります。PC環境に適したものをセットしておきましょう(通常のゲームアプリは640×480で十分です)。

#include "test2d.idx"


Dim ScreenX=640 As Long	'ディスプレイの幅  (ピクセル単位)
Dim ScreenY=480 As Long	'ディスプレイの高さ(ピクセル単位)

' TODO: この位置にグローバル変数を定義してください。

Dim pImageObj As *CImage2D

●InitProc関数のコーディング

InitProc関数はアプリケーション起動時に一度だけ呼ばれる関数であり、プログラムの初期化に関するコードを記述します。dx_Init関数を呼び出してD3Dデバイスを再生をし、ShowCursor関数でマウスカーソルを非表示にするコードがあらかじめ生成されているので、その下からオリジナルの初期化コードを記述していきます。

ここでは、CImage2Dオブジェクトの生成を行います。CImage2D::SetColor関数で四角形オブジェクトの色を設定します。適当な色をD3DCOLOR_XRGBマクロ関数を使って指定しておきましょう。

Function InitProc()
    'DirectXを初期化
    If dx_Init(hMainWnd,ScreenX,ScreenY,FALSE)=0 Then
        InitProc=0
        Exit Function
    End If

    'マウスカーソルを非表示にする
    ShowCursor(FALSE)

    ' TODO: この位置にアプリケーションの初期化コードを記述してください。

    pImageObj= New CImage2D
    pImageObj->SetColor(D3DCOLOR_XRGB(255,255,255))

    InitProc=1
End Function

●QuitProc関数のコーディング

InitProc関数がアプリケーション起動時に呼び出されるのに対し、QuitProc関数はアプリケーション終了時に一度だけ呼ばれます。プログラムの終了処理に関するコードを記述していきます。オリジナルのコードを実行後にdx_Quit関数が呼び出されるようにしておきましょう。

ここではpImageObjが示すCImage2Dオブジェクトの解放を行います。

Sub QuitProc()
    ' TODO: この位置にアプリケーションの終了処理を記述してください。

    Delete pImageObj

    'DirectXの終了処理
    dx_Quit()
End Sub

●RenderProc関数のコーディング

RenderProc関数は描画毎に呼び出されるコールバック関数です。CImage2D::Draw関数を呼び出して四角形オブジェクトを画面に描画します。

Sub RenderProc()
    ' TODO: この位置に描画に関するコードを記述してください。

    pImageObj->Draw(50,50,200,150)
End Sub

今回はInputActionProc関数のコーディングは行いませんでした。InputActionProc関数は、主に入力及び状況進行(キャラクタ移動などのアクション)に関するコードを記述するためのコールバック関数であり、RenderProc関数と同様に描画毎に呼び出されます。また、RenderProc関数より下に存在するモジュールレベルのコードは特別な理由がない限り、手を加えることはありません。

最後に、コンパイル&実行を行い、白色の四角形が画面に描画されるかどうか、試してみましょう。



講座インデックスへ戻る ©2005 Discoversoft