| DGControl チュートリアル |
2001/12/31 Presented by GTN
DGControlとは、DirectX8
からコンポーネントとして追加された DirectGraphics
のラッパークラスです。
DGControlは、DirectX8を用いて2Dの画像を描画する手順を簡略化することを第1の目的としています。
極めて簡単な手順で、デバイスの初期化から描画までを行えます。 自由に拡大,回転,α値の設定を与えて描画ができます。
DGControlは、スプライトや仮想グラフィック画面などといった、ゲームを作る際に必要な描画機能を提供するためのクラスです。 最終的には3D画像を組み合わせて描画することを考えていますが、さしあたりは2Dの描画機能を揃えることを優先して実装しています。
これは、作者が今現在作っているゲームが2Dのゲームであり、このライブラリはそのゲームを構築するための一部として開発されているからです。
現在作者が作っているゲームの開発が進み、ゲーム中に3Dオブジェクトを組み合わせて登場させるという段階までたどり着けば、自然とこのライブラリにも3D描画機能が付加されていくことでしょう。 ですが、まだまだそこまでには至っていません。 3D画像が描画できるようになるのは、相当先のハナシになります。
このライブラリを使用してゲームを作る際には、『1.現在実装されている関数のみで使用する』『2.自分で関数を追加して仕様する』の選択肢があります。
改造は自由ですので、必要な関数があれば追加して使用してください。 ただし、もし改造したライブラリ自体を公開する際には、ここのDGControlとの差違をはっきり明記するようにしてください。
DGControlの具体的な使用方法を解説します。
Windowsのアプリケーションなので、とりあえず Window
を作成して表示させます。 スタイルなどは、特にどんなものでも構いません。 ウィンドウハンドルを取得することが重要です。
Windowの作成と表示については、ここでは解説しません。
Windowを表示できたら、DGControlオブジェクトを作成します。
まず、DGControlを使用するために必要なヘッダをインクルードします。
#include "LogFile/LogFile.h" #include "Utils/Utils.h" #include "DGControl/DGControl.h" |
これで、DGControlの機能が使用可能になる筈です。
DGControlは、GTNが作っているライブラリ群の中のひとつなので、DGControl以外にも、LogFile
, Utils というコンポーネントが必要になります。
さて。
まずは、インスタンスを作成します。
CDGControl* g_pDGControl; g_pDGControl = CDGControl::CreateInstance(); |
DGControlのインスタンス作成と削除には、必ず CDGControl::CreateInstance() と CDGControl::DeleteInstance() を使用します。
DGControlは、ひとつのアプリケーション中に2つ以上のインスタンスを作成できません。
2つ目の DGControl オブジェクトを CreateInstance()
で作成しようとすると、エラーが発生し NULL が返ります。
オブジェクトを作成したら、初期化します。
初期化と同時に画面モードの切り替えなども自動的に行われます。
g_pDGControl->Initialize( hWnd , TRUE , 640 , 480 , 0 ); |
Initialize()
には、描画対象のウィンドウハンドルと、フルスクリーンにするか否か、画面サイズ、画面のリフレッシュレートを指定します。
画面サイズやリフレッシュレートは、フルスクリーン時のみ有効です。 フルスクリーンにしない場合は無視されます。
描画用の画像を読み込ませます。
読み込める画像は、DirectGraphicsがサポートしている画像形式です。 通常は、65536色以上のビットマップ画像を読み込ませます。 未テストですが、おそらくDDS形式の画像も読み込めると思います。
long lSPTextureIndex; lSPTextureIndex = g_pDGControl->AddTextureForSprite( "texture.bmp" , 0xFF00C400 ); |
画像の読み込み関数には、画像ファイル名とカラーキーを指定します。
カラーキーはα値を含んだ「ARGBフォーマット」で記述します。
読み込む際には、その使用目的によって呼ぶ関数が異なります。
スプライトとして画像を使用したい場合は、AddTextureForSprite()
を、グラフィック画面として使用したい場合は
AddTextureForGraphic() を呼び出します。
関数は戻り値として画像のID番号を返してきます。 この値は後で使用するので、変数を用意して代入し、保存しておきます。
画像を読み込んだら、次はスプライトを定義します。
大きな画像に含まれる、一部の矩形を指定することで、指定した矩形範囲をスプライトとして使用できるようになります。
long lSPIndex; lSPIndex = g_pDGControl->AddSprite( lSPTextureIndex ); g_pDGControl->SetSpriteRect( lSPIndex , rect ); g_pDGControl->SetSpriteCenter( lSPIndex , 16 , 16 ); |
まず DGControl
に、スプライトを追加します。 スプライトを追加するには
AddSprite() を使用します。
スプライトは読み込んだ画像に対して定義するものなので、先ほど取得した画像のIDを引数として指定する必要があります。
上の例では、lSPTextureIndex
のインデックス番号で指定される画像に対し、スプライトをひとつ追加しています。
関数が成功すると、DGControl内部に、スプライト用の情報の受け皿が一つ追加されます。
テクスチャの定義と同様に、スプライトのIDが返されますので、これも変数に保存しておきます。
スプライトを追加できたら、次に SetSpriteRect()
で、画像内のどの矩形領域をスプライトとして使用したいかを指定します。
初期状態での矩形領域は (0,0)-(0,0)
となっているため、これを設定しないと画面上に画像が描画されません。
初期の状態ではスプライトの原点は左上の点となっています。 回転処理などは、原点を中心に処理が行われます。
原点位置を変更したい場合は、SetSpriteCenter()
で設定を行います。
上の例では、スプライトとして定義した矩形の左上の点から、(16,16)
の位置をスプライトの原点として用いることを定義しています。
![]()
スプライトの矩形領域と中心点の関係
スプライトを定義したら、描画することができます。
g_pDGControl->StartToDraw(); g_pDGControl->DrawSprite( lSPIndex , 320,240 ); g_pDGControl->EndToDraw(); |
描画するには、まず StartToDraw() を呼び出します。
この関数は、1フレームあたりの描画を開始する前に、必ず1回だけ呼び出す必要があります。 この関数を呼び出さなければ、描画関数は必ずエラーになります。
StartToDraw() で描画開始を指示したら、DrawSprite()
でスプライトを描画できます。
この場合、(320,240)の位置に画像を描画しています。
ただし、スプライト登録時に中心点を (16,16)
としたので、画面上では (320-16,240-16)
から画像が描画されます。
1フレームあたりの描画が終わったら、EndToDraw()
関数を用いて、描画終了を通知します。
これで、1フレームあたりの描画準備が整ったことになります。
基本的に全ての描画関数は、バックバッファ(メモリ上の論理的なフレームバッファで、画面には表示されない)に対して描画を行います。 したがって、スプライトの描画関数を読んだだけでは、実際には画面上に画像は表示されません。
1フレームあたりの描画内容をバックバッファに描画し終えたら、最後にその内容を画面に反映します。
bRes = g_pDGControl->Flip(); |
これで、画面に画像が描画されます。
以上で、スプライトに関する描画手順は終了です。
仮想グラフィック画面とは、X680x0に載っていたグラフィック画面のような機能を仮想的に実現するためのものです。
大きな画像を用意して、その一部分を、窓を覗くような形で表示します。
X680x0のグラフィック画面と大きく異なる点は、覗き窓の領域を自由に指定できるという点です。
スプライトと異なって、描画対象の画像として、全ての領域が使用されます。 画像の上下,左右端は、球面座標系にすることもできますし、切れた形にすることもできます。
また、球面座標系になるように指定し、画面サイズよりも小さな画像を描画するように指定することで、同じ画像をタイル状にマップして描画することもできます。

仮想グラフィック画面の描画のされかた
登録と初期化はスプライトとほぼ同様です。
long lGRPTextureIndex; lGRPTextureIndex = g_pDGControl->AddTextureForGraphic( "back.bmp" , 0x00000000 ); |
スプライトでの画像読み込みと違って、グラフィック画面のための画像読み込みには、AddTextureForGraphic()
を使います。
スプライトと同様に、画像データのIDを返してくるので、これを変数に代入して保存しておきます。
long lGRPIndex; lGRPIndex = g_pDGControl->AddGraphic( lGRPTextureIndex ); g_pDGControl->SetGraphicView( lGRPIndex , rect ); |
登録と初期化はスプライトとほぼ同様です。
スプライトと異なり、中心点の指定はありません。 また、描画対象矩形を指定する代わりに、画面上での覗き窓の位置を指定します。
スプライトと同様の方法で描画します。
g_pDGControl->DrawGraphic( lGRPIndex , 100,100 ); |
グラフィック画面は、DrawGraphic() で描画します。
この関数を呼ぶ以前に StartToDraw()
を実行していない場合は、あらかじめ実行して描画を開始しておく必要があります。
DGControl を用いたサンプルプログラムを、以下に置いておきます。 参考にしてください。
サンプルプログラムのダウンロード
戻る