<<Back To index
CEasyDrawクラス リファレンスマニュアル
■概要
DirectDrawを簡単に初期化して使うためのクラスです。初期化はウィンドウモードとフルスクリーンモードで別れています。オフスクリーンサーフェスはクラス内に持たない構造にしてありますので、プログラマが好きなだけ、好きなサイズのスプライトを使うことができます。また、バックバッファ(裏画面)をパブリックにしてありますので、自由にアクセスして描画できます。
ただ、オフスクリーンサーフェスをプログラマに解放しているので、その管理はプログラマが行う必要があります。オフスクリーンサーフェスの解放後に描画処理をするなどという処理をしないように注意して下さい(終了時にエラーが出たりします)。
■用語説明
□フリップ
裏画面(バックサーフェス)とスクリーン(プライマリサーフェス)を切り替える動作のことです。フルスクリーンの場合は、アドレスを交換するだけなので、非常に高速です。ウィンドウモードの場合は矩形転送を行います。
EasyDrawはこの違いを吸収するので、プログラマが意識することはありません。
□プライマリサーフェス
スクリーンに出る画像データのバッファです。プログラマが直接使うことはありません。描画は普通、バックサーフェス(裏画面)に行います。
EasyDrawでは、内部にプライマリサーフェスを1枚持っていますが、プログラマが存在を意識する必要はありません。
□バックサーフェス
いわゆる裏画面のバッファです。アプリケーションは、描画を全てバックサーフェスに行います。こうすることで、描画時のちらつきを抑えることが出来ます。描画が終わったらフリップをし、裏画面を表示します。
EasyDrawではバックサーフェスを1枚、内部に持っています。パブリックなので、自由に内容を書き換えることが出来ます。描画が終わっても、フリップしないと画面には出ないので注意して下さい。
□オフスクリーンサーフェス
いわゆるスプライトを記憶しておくサーフェスです。ここにビットマップでスプライトパターンを作ります。描画するときは、Blt()やBltFast()を使ってバックサーフェスにデータを転送します。カラーキーを指定し、特定の色を透明にする事もできます。半透明合成は、現在のDirectDrawではサポートされていません(Direct 3DIMでは出来ます)。
EasyDrawでは、オフスクリーンサーフェスを外部に持つことになっています。自分で定義して、CEasyDraw::CreateSurface()で初期化、CEasyDraw::SetBitmap()でビットマップを設定して使って下さい。解放も自前でやる必要があります。
■メンバ関数
□初期化(フルスクリーン)
bool InitDxDraw(HWND hWnd,int nWidth,int nHeight,int nBits);
□初期化(ウィンドウ)
bool InitDxDrawWindow(HWND hWnd);
□パレットを設定
void SetPalette(LPDIRECTDRAWPALETTE lpPalette);
□オフスクリーンサーフェスの作成
bool CreateSurface(LPDIRECTDRAWSURFACE &lpSurface,int nWidth,int nHeight);
□サーフェスにビットマップをセットする(リソース版)
bool SetBitmap(LPDIRECTDRAWSURFACE &lpSurface,char *strBmpName,int nWidth,int nHeight);
□サーフェスにビットマップをセットする(ファイル版)
bool SetBitmapFile(LPDIRECTDRAWSURFACE &lpSurface,char *strFileName,int nWidth,int nHeight);
□画面をクリア
bool ClsBackBuffer();
□画面を指定色で塗りつぶし
bool BackFillColor(DWORD dwFillColor);
□フリップ
void EasyFlip();
□オブジェクトを解放
bool ReleaseAll();
□初期化(フルスクリーン)
bool InitDxDraw(HWND hWnd,int nWidth,int nHeight,int nBits);
引数
HWND hWnd
ウィンドウハンドルです。初期化に必要なので、必ず渡してください。
int nWidth
画面の幅です。320、640、1280などを指定してください。一般的には640を指定します。
int nHeight
画面の幅です。240、480、960などを指定してください。一般的には480を指定します。
int nBits
ビット深度です。平たく言うと色の数です。8ビットで256色モード、16ビットで6万5000色モード、32ビットでフルカラーです。16ビットを指定すると何かと楽です。
戻り値
bool型 失敗>false 成功>true
解説
フルスクリーンモードで、DirectDrawを初期化します。初期化に成功すればDirectDrawを使うことが可能になります。
使用例
if(!MyDraw.InitDxDraw(hWnd,640,480,16)) return;//フルスクリーンモードで初期化
SetWindowLong(hWnd,GWL_STYLE,WS_POPUP);//ウィンドウの余計な部分を消す
□初期化(ウィンドウ)
bool InitDxDrawWindow(HWND hWnd);
引数
HWND hWnd
ウィンドウハンドルです。初期化に必要なので、必ず渡してください。
戻り値
bool型 失敗>false 成功>true
解説
ウィンドウモードで、DirectDrawを初期化します。初期化に成功すればDirectDrawを使うことが可能になります。フルスクリーンモードと違い、画面のサイズは指定しません。サイズはウィンドウのサイズに、色数は、その時のディスプレイモードに依存します。
使用例
if(!MyDraw.InitDxDrawWindow(hWnd)) return;//ウィンドウモードで初期化
□オフスクリーンサーフェスの作成
bool CreateSurface(LPDIRECTDRAWSURFACE &lpSurface,int nWidth,int nHeight);
引数
LPDIRECTDRAWSURFACE &lpSurface
サーフェスのポインタです。作成に成功すると、サーフェスのアドレスが格納されます。
int nWidth
サーフェスの幅です。2の累乗の値(16,32,64...)を指定します。
int nHeight
サーフェスの高さです。2の累乗の値(16,32,64...)を指定します。
戻り値
bool型 失敗>false 成功>true
解説
オフスクリーンサーフェスを作成します。DirectDrawアプリでは、いわゆるスプライトパターンを、オフスクリーンサーフェスとして作ります。スプライト1枚にサーフェスが1枚必要です。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
LPDIRECTDRAWSURFACE lpSprite;//オフスクリーンサーフェス
//初期化などなど・・・・
MyDraw.CreateSurface(lpSprite,32,32);//オフスクリーンサーフェスを作る
□パレットをセット
void SetPalette(LPDIRECTDRAWPALETTE lpPalette);
引数
LPDIRECTDRAWPALETTE lpPalette
プライマリサーフェスにセットするパレットオブジェクトのポインタです。パレットオブジェクト、及び中身はプログラマが用意して下さい。
戻り値
なし
解説
プライマリサーフェスにパレットを設定します。256色モードの時にはパレットの設定が必要になります。ビットマップなどから作成したパレットを指定して、この関数を呼び出して下さい。16bitモード以上の場合は、パレットの設定は必要ありません。
□サーフェスにビットマップをセットする(リソース版)
bool SetBitmap(LPDIRECTDRAWSURFACE &lpSurface,char *strBmpName,int nWidth,int nHeight);
引数
LPDIRECTDRAWSURFACE &lpSurface
サーフェスのポインタです。
char *strBmpName
ビットマップのリソース名です。リソースの名前は、文字列で設定しおいてください。リソースのプロパティで、名前をダブルクォーテーションでくくると、文字列の名前にできます。
int nWidth
ビットマップの幅です。サーフェスのサイズと同じになるように画像を作っておいてください(違う場合は自動で補正されます)。
int nHeight
ビットマップの高さです。
戻り値
bool型 失敗>false 成功>true
解説
オフスクリーンサーフェスに、リソースからビットマップを読み込みます。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
LPDIRECTDRAWSURFACE lpSprite;//オフスクリーンサーフェス
//初期化などなど・・・・
MyDraw.SetBitmap(lpSprite,"IDB_KAO",32,32);//ビットマップを設定
□サーフェスにビットマップをセットする(ファイル版)
bool SetBitmapFile(LPDIRECTDRAWSURFACE &lpSurface,char *strFileName,int nWidth,int nHeight);
引数
LPDIRECTDRAWSURFACE &lpSurface
サーフェスのポインタです。
char *strFileName
ビットマップのファイル名です。絶対パスを指定しない場合、実行ファイルのパスを基準にします。
int nWidth
ビットマップの幅です。サーフェスのサイズと同じになるように画像を作っておいてください(違う場合は自動で補正されます)。
int nHeight
ビットマップの高さです。
戻り値
bool型 失敗>false 成功>true
解説
オフスクリーンサーフェスに、ファイルからビットマップを読み込みます。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
LPDIRECTDRAWSURFACE lpSprite;//オフスクリーンサーフェス
//初期化などなど・・・・
MyDraw.SetBitmapFile(lpSprite,"kao.bmp",32,32);//ビットマップを設定
□画面をクリア
bool ClsBackBuffer();
引数
なし
戻り値
bool型 失敗>false 成功>true
解説
バックバッファを黒で塗りつぶします。失敗、つまり、EasyDrawを初期化していないときはfalseを返します。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
//初期化などなど・・・・
MyDraw.ClsBackBuffer();//バックバッファをクリア
□画面を指定色で塗りつぶし
bool BackFillColor(DWORD dwFillColor);
引数
DWORD dwFillColor
塗りつぶす色を指定します。RGB形式で、"0xff0000"などと指定して下さい。
戻り値
bool型 失敗>false 成功>true
解説
バックバッファを指定色で塗りつぶします。失敗、つまり、EasyDrawを初期化していないときはfalseを返します。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
//初期化などなど・・・・
MyDraw.BackFillColor(0xff0000);//画面を赤で塗りつぶし
□フリップ
void EasyFlip();
引数
なし
戻り値
なし
解説
DirectDrawでは、画面を二つ用意し、描画は全て裏画面に行います。描画が終わった時d点で裏画面を表示します。その、切り替えの動作をします。ウィンドウモードとフルスクリーンモードでは、切り替えの動作が異なりますが、その違いを意識しなくても使えます。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
//初期化などなど・・・・
if(MyDraw.ClsBackBuffer()) {//バックバッファをクリア
//スプライトを描画
MyDraw.m_lpBackBuffer->BltFast(0,0,lpSprite,&srcrect,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
MyDraw.EasyFlip();//フリップ
}
□DirectDrawオブジェクトを解放
bool ReleaseAll();
引数
なし
戻り値
bool型 失敗>false 成功>true
解説
EasyDrawで内包しているDirectDrawオブジェクトを解放します。画面モードをウィンドウモードからフルスクリーンに変える場合、その逆、オフスクリーンサーフェス解放後の描画処理防止、などの為に使います。
使用例
CEasyDraw MyDraw;//EasyDrawオブジェクト
//初期化などなど・・・・
MyDraw.ReleaseAll();//解放
■パブリック変数
□バックバッファ
LPDIRECTDRAWSURFACE m_lpBackBuffer;
機能
DirectDrawの裏画面です。描画は全てこのバッファに行います。描画が終わったらフリップを掛けて、ディスプレイに表示してください。
■サンプルソース
//------------------------------------------------------------------
// draw.cpp : CEasyDrawサンプルプログラム
//
//------------------------------------------------------------------
//内容
// DirectDrawの初期化、ビットマップのロード、描画、フリップ、
//解放のサンプルです。
//------------------------------------------------------------------
#include "stdafx.h"
#include "EasyDraw.h"
bool bFullScreen = true;//初期化スイッチ
HRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);//メッセージ処理
CEasyDraw MyDraw;//CEasyDrawオブジェクト
LPDIRECTDRAWSURFACE7 lpStar[128];//オフスクリーンサーフェス
POINT pStarPos[128];//星の位置
//---------------------------------------------------
//関数名 WinMain()
//機能 メイン関数
//---------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{
WNDCLASSEX wndclass;//ウィンドウクラス
HWND hWnd; // ウインドウハンドル
MSG msg; //メッセージ
// ウインドウクラスの生成
ZeroMemory( &wndclass, sizeof( wndclass));
wndclass.style = 0;
wndclass.lpfnWndProc = WinProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wndclass.lpszClassName = "Easy Lib Test";
wndclass.cbSize = sizeof(WNDCLASSEX);
if( !RegisterClassEx( &wndclass)) {
MessageBox(NULL,"ウィンドウのレジストに失敗。","Error",MB_OK|MB_ICONEXCLAMATION);
return 0;
}
// ウインドウの生成
hWnd = CreateWindowEx(WS_EX_APPWINDOW,"Easy Lib Test","Easy Lib Test",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,640,480,HWND_DESKTOP, NULL,hInstance, NULL);
ShowWindow( hWnd,SW_SHOW);
UpdateWindow( hWnd);
//初期化
if(bFullScreen) {
if(!MyDraw.InitDxDraw(hWnd,640,480,16)) return 0;//フルスクリーン
}
else {
if(!MyDraw.InitDxDrawWindow(hWnd)) return 0;//ウィンドウモード
}
RECT srcrect;
srcrect.left = 0;
srcrect.top = 0;
srcrect.bottom = 16;
srcrect.right = 16;
DDCOLORKEY ddck; // カラーキー
ddck.dwColorSpaceLowValue = 0; // 黒を指定
ddck.dwColorSpaceHighValue = 16;
//星を初期化
int i;
srand( (unsigned)time( NULL ) );
for(i = 0; i < 128; i++) {
MyDraw.CreateSurface(lpStar[i],16,16);//サーフェスをつくる
lpStar[i]->SetColorKey(DDCKEY_SRCBLT, &ddck);//カラーキーを設定
MyDraw.SetBitmap(lpStar[i],"IDB_STAR",16,16);//ビットマップを設定
pStarPos[i].x = rand() % 640+420;
pStarPos[i].y = rand() % 800 - 700;
}
// メイン メッセージ ループ:
while(TRUE)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
if (msg.message == WM_QUIT){
PostQuitMessage(msg.wParam);
return 0;
}
TranslateMessage( &msg );
DispatchMessage( &msg );
}
if(MyDraw.ClsBackBuffer()) {//黒でクリア 成功したら描画
for(i = 0; i < 128; i++) {
MyDraw.m_lpBackBuffer->BltFast(pStarPos[i].x,pStarPos[i].y,lpStar[i],&srcrect,DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);//描画
//星を移動
pStarPos[i].x -= 3;
pStarPos[i].y += 2;
if(pStarPos[i].x < 0 || pStarPos[i].y > 480) {
pStarPos[i].x = rand() % 1024+200;
pStarPos[i].y = 0;
}
}
MyDraw.EasyFlip();//フリップ
}
}
return 0;
}
//---------------------------------------------------
//関数名 WinProc()
//機能 メイン ウィンドウのメッセージを処理します。
//---------------------------------------------------
HRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message) {
case WM_DESTROY: {//終了処理
//オフスクリーンサーフェスを解放
for(int i = 0; i < 128; i++) {
RELEASE(lpStar[i]);
}
MyDraw.ReleaseAll();//EasyDrawを解放
PostQuitMessage(0);
break;
}
default:
return DefWindowProc( hWnd, message, wParam, lParam );
}
return 0;
}
タブは全角スペースになってます。ビルドするためには、プロジェクトにEasyDraw.hとEasyDraw.cppを追加して、dxguid.lib、ddraw.libをリンクしてください。当然ですが、DirectX7のSDKが必要になりますので、別途入手してください。
stdafx.hでは、windows.h、stdlib.h、malloc.h、memory.h、tchar.h、stdio.h、time.hをインクルードしていますが、多分全部は必要ないです。
written by Matsumoto keizi
|