5-7 CDDPro90マニュアル

ここではCDDPro90に実装されている各関数の詳細について説明しています。

CDDPro90ライブラリは例えば初期化に失敗したにも関わらずそのまま描画処理を行おうとしたり、
インデックスをオーバーして参照しようとした場合でも、ソフトがクラッシュしないように常にチェックが行われています。
※一部の関数はチェックされません

各関数は基本的にBOOL値が戻り値になっており、失敗時はFALSEが返るようになっているので、
描画がされなかったりする場合はこの戻り値を確認してみるとよいかもしれません。

座標系について

CDDPro90は内部では右手系として処理しています。


このライブラリを単に2D表示用に使用するだけであれば、特に何も気にする必要はありません。

依存ファイル

CDDPro90ライブラリは内部でCDDTexPro90ライブラリを使用しています。
CDDTexPro90はテクスチャのロードなどを管理するクラスで、基本的にはプログラム側から直接扱う必要はありません。

また、デバッグ出力用にDEBUG.HとDEBUG.CPPが必要です。
デフォルトではCDDPro90ライブラリはデバッグ出力されない設定になっていますが、
cppの先頭にある「#define DEBUG」のコメントを外すことで、
デバッグライブラリが初期化されていればエラーなどを出力することが出来ます。

プログラムの流れ

①ヘッダのインクルード

CDDPro90を使用するソースファイルに以下のように定義することで、自動的にCDDTexPro90もインクルードされます。
#include "CDDPro90.h"

②実体の定義

グローバル変数に以下のように定義することで実体が定義出来ます。
CDDPro90 dd;

もしくはnewを使用して実体を確保することも出来ます。
CDDPro90 *dd = new CDDPro90();
※この場合はdeleteを忘れないようにしてください

③初期化

クラスのCreate()を呼び出してDirect3Dを初期化します。
    // 640x480の32bitカラー、VSync待ちありで初期化
    if( !dd.Create(hWnd,TRUE,640,480,32,0,TRUE) ) {
        // エラー
    }
初期化が完了したらあとは自由にテクスチャをロードしたり描画処理を行うことが出来るようになります。

④ テクスチャのロード

exeファイルと同一箇所に画像ファイルが存在する場合は、以下のように相対指定でその画像を読み込むことが出来ます。
    // 0番目に画像をロード
    if( !dd.AddTexture(0,"BACK.BMP") )
        return FALSE;    // エラー
番号は最大でCDDMAXTEXTURE-1まで指定することが出来るため、同時に何枚でもロードすることが出来ます。
※CDDMAXTEXTUREは現状2048と定義されています

⑤表示領域の切り抜き

容量を削減するため通常は1枚のテクスチャに複数の画像を詰め込んで作成しますが、
ここではこれらを1つ1つの画像として切り抜く作業を行います。
    dd.SetPutRange( 0,0,0,0,128,480 );      // 背景
    dd.SetPutRange( 1,0,224,0,256,256 );    // センターアニメーション
    dd.SetPutRange( 10,0,130,0,28,419 );    // 白
    dd.SetPutRange( 11,0,160,0,24,419 );    // 青
    dd.SetPutRange( 12,0,186,0,35,419 );    // 赤
    dd.SetPutRange( 15,0,130,422,28,6 );    // 白
    dd.SetPutRange( 16,0,160,422,24,6 );    // 青
    dd.SetPutRange( 17,0,186,422,35,6 );    // 赤
最初の引数は切り抜きIDで、値はCDDMAXOBJECT-1まで指定することが出来ます。
2つ目の引数は参照するテクスチャの番号で、ここでは仮にAddTextureで指定した0を設定していますが、
これにより結果的にBACK.BMP内の座標とサイズで切り抜いたことになります。
さらに他のテクスチャをロードしている場合はその番号を指定することで、
複数のテクスチャを切り抜き番号のみで参照することが出来るようになります。

⑥描画処理

切り抜いた画像を実際に表示するにはメインループで以下のように定義します。
    dd.CheckDevice();

    dd.DrawBegin();
    dd.Put( 0,100,50 );
    dd.DrawEnd();
例えばフルスクリーンで起動している時、ALT+TABなどでWindowsに戻ってくるとDirect3Dはロスト状態となります。
そのあと再びフルスクリーンに戻ってきた場合、テクスチャなどが開放された状態となっているため画面には何も表示されなくなります。
これを復旧させるのがCheckDevice()であり、上記のように必ず毎フレーム1回呼び出すようにすることで自動的に復旧させることが出来ます。
※このライブラリのみを使用して2D描画を行う分にはこれで問題ありませんが、自前でレンダーテクスチャなどを使用している場合、
 それらは自動的には復旧は出来ないためCheckDevice()の戻り値を監視し、必要ならば開放と再構築を自分で行う必要があります

描画を開始するにはDrawBegin()、描画が完了したらDrawEnd()を呼び出すことで実際に画面に表示されます。

ここでは切り抜き画像0番(背景)をx=100、y=50の位置に表示していますが、
例えばこの画像を半透明で表示したい場合は、以下のように先に半透明値をセットしてから描画します。
    dd.DrawBegin();
    dd.SetPutStatus( 0,0.5f );
    dd.Put( 0,100,50 );
    dd.DrawEnd();

⑦終了処理

ゲームを終了する場合はDelete()を呼び出します。
    dd.Delete();

実はこの関数を明示的に呼び出さずとも、実際にはクラスが破棄される際に自動的にDelete()が呼び出されるようになっています。
しかし、ウィンドウが先に閉じられていたりすると稀にクラッシュすることがあるため、
基本的にはウィンドウを閉じる直前などに呼び出しておくことをお勧めします。

APIリファレンス


各関数をクリックするとその詳細が表示されます。

CDDPro90::Create

デフォルトのデバイスを使ってDirect3D9を初期化します。
BOOL Create(
   HWND hwnd,
   BOOL full=TRUE,
   int w=1024,
   int h=768,
   int bit=32,
   int freq=0,
   BOOL vsync=TRUE,
   DWORD vs=D3DVS_VERSION(0,0),
   DWORD ps=D3DPS_VERSION(0,0)
);

パラメータ

hwnd
[in] アプリケーションのウインドウハンドル
full
[in] フルスクリーン化するか
w
[in] 構築するバックバッファの幅
h
[in] 構築するバックバッファの高さ
bit
[in] フルスクリーン時に使用する画面のビット数
freq
[in] フルスクリーン時に指定するリフレッシュレート
0を指定するとハードウェアのデフォルト値が指定されます。
vsync
[in] 画面の帰線期間でフリップを行うか
FALSEに設定すると帰線期間を待たずにフリップされるため、
画面がチラついたりティアリングが発生することがあります。
vs
[in] 使用したい頂点シェーダーのバージョンを指定する
指定したバージョンがハードウェアで対応していない場合、
エミュレーションモードとなります。
特に頂点シェーダーを使用しない場合は、D3DVS_VERSION(0,0)を渡します。
ps
[in] 使用したいピクセルシェーダーのバージョンを指定する
指定したバージョンがハードウェアで対応していない場合、
エミュレーションモードとなります。
特にピクセルシェーダーを使用しない場合は、D3DPS_VERSION(0,0)を渡します。

戻り値

Direct3Dが構築出来たらTRUE、失敗した場合はFALSEを返します。

CDDPro90::Delete

内部のテクスチャやDirect3Dを全て開放してライブラリを終了します。
BOOL Delete(
    void
);

パラメータ

無し

戻り値

現状にTRUEを返します。

CDDPro90::Clear

ロードしたテクスチャや切り抜き情報を全てクリアします。
ゲームを最初から始める場合など、リセットしたい場合に使用します。
BOOL Clear(
    void
);

パラメータ

無し

戻り値

現状にTRUEを返します。

CDDPro90::SetHand

内部処理を右手系か左手系に設定します。
このクラスの関数を使って2Dを表示させるだけであれば、どちらの設定でも特に表示に影響はありません。
BOOL SetHand(
    BOOL right=TRUE
);

パラメータ

right
[in] 右手系で使用する場合はTRUE

戻り値

現状にTRUEを返します。

CDDPro90::SetBackColor

DrawBeginでバックバッファをクリアする場合のクリア色を設定します。
void SetBackColor(
    D3DCOLOR col=0x000000
);

パラメータ

col
[in] クリア色をRGB形式で指定

戻り値

現状にTRUEを返します。

CDDPro90::SetPlugin

Susieプラグインの存在するパスとプラグインの拡張子を設定します。
指定しなかった場合はカレントパス内の拡張子spiのプラグインを検索します。
※この関数はCSusieライブラリを使用する場合のみ適用されます
BOOL SetPlugin(
    const char *path,
    const char *ext
);

パラメータ

path
[in] プラグインのパス
ext
[in] プラグインの拡張子(ドット無し)

戻り値

現状にTRUEを返します。

CDDPro90::AddTexture(1)

画像ファイルを指定のテクスチャIDにロードします。
対応している形式は「BMP」「TGA」「DDS」「DIB」「JPG」「PNG」です。
※これ以外の形式の場合はCSusieライブラリ経由でロードされます(要CSusieクラス)
BOOL AddTexture(
    int id,
    const char *file
);

パラメータ

id
[in] ロードしたいテクスチャID(0~CDDMAXTEXTURE-1まで)
file
[in] ロードしたい画像ファイル名

戻り値

画像がロード出来たらTRUE、失敗した場合はFALSEを返します。

CDDPro90::AddTexture(2)

メモリ上の画像ファイルのイメージバッファを指定のテクスチャIDにロードします。
対応している形式は「BMP」「TGA」「DDS」「DIB」「JPG」「PNG」です。
※これ以外の形式の場合はCSusieライブラリ経由でロードされます(要CSusieクラス)
BOOL AddTexture(
    int id,
    const LPVOID buf,
    int size
);

パラメータ

id
[in] ロードしたいテクスチャID(0~CDDMAXTEXTURE-1まで)
buf
[in] 画像メモリイメージの先頭のポインタ
size
[in] 画像メモリイメージのサイズ

戻り値

画像がロード出来たらTRUE、失敗した場合はFALSEを返します。

CDDPro90::DelTexture

指定のテクスチャIDの画像を明示的に開放します。
BOOL DelTexture( int id );

パラメータ

id
[in] 削除したいテクスチャID

戻り値

テクスチャIDの範囲が正しくない場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::SetPutRange

指定したテクスチャの一部を切り抜き情報として登録します。
Putなどの描画関数はこのIDを指定します。
切り抜いた画像の原点を設定するには、その切り抜き画像の左上を(0,0)としたオフセット分で指定します。
デフォルトの(0,0)を指定した場合は左上が原点となります。
BOOL SetPutRange(
    int id,
    int tex_id,
    int x,
    int y,
    int w,
    int h,
    int ox=0,
    int oy=0
);

パラメータ

id
[in] 登録する切り抜きID
tex_id
[in] 参照するテクスチャのID
x
[in] 切り抜くテクスチャの左上X座標
y
[in] 切り抜くテクスチャの左上Y座標
w
[in] 切り抜くテクスチャの指定の左上X座標からの幅
h
[in] 切り抜くテクスチャの指定の左上Y座標からの高さ
ox
[in] 切り抜くテクスチャの原点のXオフセット座標
oy
[in] 切り抜くテクスチャの原点のYオフセット座標

戻り値

切り抜きIDやテクスチャIDの範囲が正しくない場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::SetPutStatus

切り抜いた画像の表示方法を設定します。
この関数で指定したパラメータはPutなどの描画関数で使用されます。
BOOL SetPutStatus(
    int id,
    float alpha=1.0f,
    float scale=1.0f,
    float rot=0.0f
);

パラメータ

id
[in] 設定したい切り抜きID
alpha
[in] 透明度(0.0f~1.0f)
不透明とする場合は1.0fを指定する。
scale
[in] スケール値
スケールは縦と横同じ値が設定される。
等倍の場合は1.0fを指定する。
マイナス値を指定すると反転表示される。
rot
[in] 回転量(ラジアン単位)

戻り値

切り抜きIDの範囲が正しくない場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::SetPutStatusEx

切り抜いた画像の表示方法を細かく設定します。
この関数では縦と横で別々にスケール値を設定出来ます。
それ以外の仕様はSetPutStatusと同じです。
BOOL SetPutStatusEx(
    int id,
    float alpha=1.0f,
    float scale_x=1.0f,
    float scale_y=1.0f,
    float rot=0.0f
);

パラメータ

id
[in] 設定したい切り抜きID
alpha
[in] 透明度(0~1)
不透明とする場合は1.0fを指定する。
scale_x
[in] Xスケール値
scale_y
[in] Yスケール値
rot
[in] 回転量(ラジアン単位)

戻り値

切り抜きIDの範囲が正しくない場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::CheckDevice

フルスクリーンが解除されロスト状態となった場合に、再度画面が復帰した際にロード済みのテクスチャを自動的にリストアします。
また、レンダーテクスチャなどを自前で使用している場合、この関数の戻り値によりロスト時の開放とリストア時の
テクスチャの再構築のタイミングを判断出来ます。
この関数は基本的に毎フレームDrawBeginの前で呼び出すようにして下さい。
BOOL CheckDevice(
    void
);

パラメータ

無し

戻り値

通常のロストが発生していない状態ではTRUEが返り、ロストが発生すると復帰するまでFALSEが返ります。
ロスト状態から復帰すると再びTRUEに戻ります。

ロスト発生後にこの関数を呼び出す前に復帰した場合でもこの関数は必ず一度はFALSEを返します。
これにより確実に自前のレンダーテクスチャなどの開放と再構築を行うことが可能です。

CDDPro90::DrawBegin

シーンの開始を宣言します。
関数を呼び出した時に同時にバックバッファをクリアすることが出来ます。
これ以降DrawEndが呼び出されるまでPutなどの描画関数が使用出来ます。
なお、この関数を呼び出すとDirec3Dは以下のような2D用ステートに設定されるため、
自前で3D表示を行う場合はライブラリのソースを確認しながらステートを設定しなおしてください。
 ブレンド方法 : アルファブレンド
 補間方法   : ポイントサンプル
 カリング   : 右手系か左手系に合わせて裏面の描画を行わない
 Zバッファ  : OFF
BOOL DrawBegin(
    BOOL clear=TRUE
);

パラメータ

clear
[in] バックバッファをクリアするかを指定

戻り値

ロスト中などでシーンが開始出来ない場合はFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::DrawEnd

シーンの終了を宣言し画面をフリップ(実際に画面に表示)します。
ライブラリの初期化時にウィンドウモードでVSYNCありとした場合は、
ソフトウェアによりこの中でVSYNC待ちをエミュレートします。
BOOL DrawEnd(
    void
);

パラメータ

無し

戻り値

シーンが始まっていないかロスト中ならFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::Put

SetPutRangeで切り抜いた画像を描画します。
切り抜き画像の原点位置がこの関数に指定した座標となるように描画されます。
また描画時にSetPutStatusなどで指定した描画パラメータが適用されます。
BOOL Put( int id,float x,float y );

パラメータ

id
[in] 描画する切り抜きID
x
[in] 描画先のX座標
y
[in] 描画先のY座標

戻り値

切り抜きIDの範囲が正しくない場合や、ロスト中の場合などで描画が出来なかった場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::Put2

SetPutRangeで切り抜いた画像をその画像の中心を原点として描画します。
切り抜き時に指定したオフセットは無視され、強制的に画像の中心を原点とします。
それ以外の仕様はPutと同じです。
BOOL Put2( int id,float x,float y );

パラメータ

id
[in] 描画する切り抜きID
x
[in] 描画先のX座標
y
[in] 描画先のY座標

戻り値

切り抜きIDの範囲が正しくない場合や、ロスト中の場合などで描画が出来なかった場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::PutEx

SetPutRangeで切り抜いた画像を、任意の位置を原点として描画します。
切り抜き時に指定したオフセットは無視され、強制的にここで指定したオフセット座標を原点とします。
それ以外の仕様はPutと同じです。
BOOL PutEx( int id,float x,float y,float ox,float oy );

パラメータ

id
[in] 描画する切り抜きID
x
[in] 描画先のX座標
y
[in] 描画先のY座標
ox
[in] 原点となるXオフセット座標
oy
[in] 原点となるYオフセット座標

戻り値

切り抜きIDの範囲が正しくない場合や、ロスト中の場合などで描画が出来なかった場合にFALSEを返します。
それ以外はTRUEを返します。

CDDPro90::SetBlendOne

加算合成か通常のアルファブレンドによる合成かを指定します。
この関数はSetRenderStateを内部で呼び出すだけのラッパー関数です。
※ラッパー関数はOpenGLの移植時など、他の描画エンジンとの整合性を取るためのインターフェースとして利用できます
BOOL SetBlendOne( BOOL on=TRUE );

パラメータ

on
[in] 加算合成に設定する場合はTRUE、アルファブレンドに戻すにはFALSEを指定

戻り値

3Dデバイスが構築されていなければFALSE、
それ以外はTRUEを返します。

CDDPro90::SetRenderState

Direct3D9のSetRenderStateのラッパー関数です。
直接3Dデバイスを制御する場合などに使用します。
BOOL SetRenderState( D3DRENDERSTATETYPE type,DWORD flag );

パラメータ

type
[in] 変更対象のデバイスステート定数(D3DRENDERSTATETYPE列挙型)
flag
[in] 設定するステート値

戻り値

成功時はTRUE、失敗時はFALSEを返します。
細かいエラーは取得しないため、必要ならばGetD3DDeviceからIDirect3DDevice9を取得して、
直接SetRenderStateを呼び出してください。

CDDPro90::SetTextureStageState

Direct3D9のSetTextureStageStateのラッパー関数です。
直接3Dデバイスを制御する場合などに使用します。
BOOL SetTextureStageState( DWORD st,D3DTEXTURESTAGESTATETYPE type,DWORD val );

パラメータ

st
[in] 設定するテクスチャのステージ識別子
type
[in] 設定するテクスチャステート定数(D3DTEXTURESTAGESTATETYPE列挙型)
val
[in] 設定するステート値

戻り値

成功時はTRUE、失敗時はFALSEを返します。
細かいエラーは取得しないため、必要ならばGetD3DDeviceからIDirect3DDevice9を取得して、
直接SetTextureStageStateを呼び出してください。

CDDPro90::GetD3DDevice

内部で管理しているIDirect3DDevice9インターフェースポインタを返します。
このクラスに定義されていないDirect3D9Device関数を使いたい場合などに使用します。
inline LPDIRECT3DDEVICE9 GetD3DDevice( void );

パラメータ

無し

戻り値

IDirect3DDevice9インターフェースのポインタを返します。
まだ構築されていない場合はNULLが返ります。

CDDPro90::operator LPDIRECT3DDEVICE9

内部で管理しているIDirect3DDevice9インターフェースポインタを返します。
IDirect3DDevice9のインターフェースを必要とする外部の関数などに、
このクラスの実体を渡すだけで自動的に内部のIDirect3DDevice9を渡すことが出来ます。
operator LPDIRECT3DDEVICE9( void );

パラメータ

無し

戻り値

IDirect3DDevice9インターフェースのポインタを返します。
まだ構築されていない場合はNULLが返ります。

CDDPro90::GetD3DCaps

Direc3D9のデバイスの能力を返します。
この値はCreate後に有効です。
const D3DCAPS9 *GetD3DCaps( void );

パラメータ

無し

戻り値

デバイス能力が入ったD3DCAPS9構造体のポインタが返ります。(詳しくはこちら)

CDDPro90::GetTexClass

内部で管理しているCDDTexPro90のテクスチャクラスを返します。
基本的に直接テクスチャを操作する必要はありません。
※必要ならばCDDTexPro90のhファイルを確認してください
CDDTexPro90 *GetTexClass( int id );

パラメータ

id
[in] 取得したいテクスチャID

戻り値

指定したIDのCDDTexPro90のポインタが返ります。
この関数はテクスチャIDの範囲はチェックされません。