DirectXについて今後記載予定。
//プリプロセッサ命令// //プリプロセッサに直接命令を出している。// #pragma comment(lib,"d3d9.lib") //libをプログラムに埋め込んでいる #pragma comment(lib,"d3dx9.lib") //#pragma comment(lib,???)はプログラムにライブラリを埋め込む #pragma warning(disable : 4819)
#include <Windows.h> //WinodwsAPIを使用する為に必要なヘッダーファイル #include <d3d9.h> //DirectX9ヘッダーファイル #include <d3dx9.h> //D3DX9ヘッダーファイル #include <tchar.h> #pragma warning(default : 4819)
//マクロ//
#define API_NAME TEXT("Window Class")
#define RELEASE(x) {if(x){(x)->Release();(x)=NULL;}}
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE |D3DFVF_TEX1)
//プロトタイプ宣言// LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HRESULT InitWindow(HINSTANCE); //InitWindow関数のプロトタイプ宣言
//グローバル変数宣言// HWND hWnd; //HWND型変数 LPDIRECT3D9 g_pD3D = NULL; //Direct3D9オブジェクト LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //DirectX9デバイス LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //VertexBufferオブジェクト(ポインタ) LPDIRECT3DTEXTURE9 texture = NULL; //IDirect3DTexture8インターフェイスへのポインタ
//キャラの情報(x座標,y座標,zバッファ,スピード)
float cx,cy,cz,speed;
//構造体//
struct CUSTOMVERTEX{
FLOAT x,y,z,rhw;
DWORD color;
FLOAT tu,tv;
};
//
enum
{
INP_FREE,
INP_PULL,
INP_PUSH,
INP_HOLD
};
///ウィンドウクラスの初期化//
HRESULT InitWindow(HINSTANCE hInstance)
{
//変数宣言//
WNDCLASS wc; //WNDCLASS型変数。ウィンドウクラスの初期化するために必要。
//ウィンドウクラスの初期化// wc.style = CS_HREDRAW | CS_VREDRAW; //スタイル wc.lpfnWndProc = WndProc; //ウィンドウプロシージャ wc.cbWndExtra = 0; //補助メモリ wc.cbClsExtra = 0; //補助メモリ wc.hInstance = hInstance; //インスタンスハンドル wc.hIcon = NULL; //アイコン wc.hCursor = NULL; //カーソル wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1; //背景ブラシ wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = API_NAME; //クラス名
//ウィンドウクラスの登録//
if (!RegisterClass(&wc)) {
MessageBox(
NULL,
TEXT("(;゚Д゚)ウィンドウクラスの作成に失敗しました! "),
NULL,
MB_OK | MB_ICONSTOP
);
return E_FAIL; //失敗 }
//ウィンドウの生成//
hWnd = CreateWindow(
API_NAME, //クラス名
TEXT("Window Title"), //ウィンドウタイトル名
WS_OVERLAPPEDWINDOW, //ウィンドウのスタイル
100, //ウィンドウの初期位置(横)
100, //ウィンドウの初期位置(縦)
600, //ウィンドウの幅
600, //ウィンドウの高さ
NULL, //子ウィンドウ作成時、親ウィンドウを指定する場合指定。
NULL, //メニュー設定
hInstance, //インスタンスハンドル
NULL //ウィンドウパラメータ
);
//ウィンドウ生成チェック//
if (hWnd == NULL){
MessageBox(
NULL,
TEXT("(;゚Д゚)ウィンドウクラスの生成に失敗しました! "),
NULL,
MB_OK | MB_ICONSTOP
);
return E_FAIL; //失敗
}
return S_OK; //ウィンドウクラスの初期化成功 }
//DirectX9の初期化//
HRESULT InitDirect()
{
//Direct3D・オブジェクトの生成
//補足:Direct3DCreate9関数でDirect3Dオブジェクトを生成する。
// :この関数に渡す引数はSDKのバージョン。
// :D3D_SDK_VERSIONはSDKのバージョン情報。多分、マクロだと思われ。
// :戻り値は、生成したDirect3Dオブジェクトを返す、生成失敗の場合NULLを返す
if (!(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL; //失敗
}
//現在のディスプレイモードを取得// D3DDISPLAYMODE d3ddm;
//先ほど取得したDirect3Dのメソッド.GetAdapterDisplayModeでディスプレイモードを取得する。
//D3DADAPTER_DEFAULTはプライマリ・ディスプレイ・アダプタになる。
//&d3ddmはD3DDISPLAYMODE型のポインタを渡す。
//GetAdapterDisplayModeメソッドがHRESULT型なので、FAILEDマクロでエラーかを判断する。
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL; //検出失敗
}
//D3Dデバイスの設定
D3DPRESENT_PARAMETERS d3dpp = {0};
d3dpp.Windowed = TRUE; //TRUE:ウィンドウ モード//FALSE:フルスクリーンモード
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format; //現在の画面モードを使用
//D3Dデバイスの生成(HALモード)
if (FAILED(g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice)))
{
//REFモードで再試行
if (FAILED(g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice)))
{
MessageBox(
NULL,
TEXT("Direct3Dの初期化に失敗"),
NULL,
MB_OK | MB_ICONSTOP);
return E_FAIL; //D3Dデバイスの生成失敗
}
}
//テクスチャーの読み込み
if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,TEXT("top_img04.jpg"),&texture)))
return E_FAIL;
return S_OK; //DreictXの初期化成功 }
//GetInputKey()
//指定したキーコードの状態をflagに代入します。
VOID GetInputKey(int code,int& flag)
{
if(GetKeyState(code) < 0)
{
if(flag == INP_FREE)
flag = INP_PUSH;
else
flag = INP_HOLD;
}else{
if(flag == INP_PUSH || flag == INP_HOLD)
flag = INP_PULL;
else
flag = INP_FREE;
}
}
//KeyProc()
//キーボード操作の処理
VOID KeyProc()
{
static INT LeftFlag,UpFlag,RightFlag,DownFlag;
GetInputKey(VK_LEFT,LeftFlag); GetInputKey(VK_UP,UpFlag); GetInputKey(VK_RIGHT,RightFlag); GetInputKey(VK_DOWN,DownFlag);
if(LeftFlag >= INP_PUSH)
{
if((cx -= speed) < 30.0f)
cx = 30.0f;
}
if(UpFlag >= INP_PUSH)
{
if((cy -= speed) < 30.0f)
cy = 30.0f;
}
if(RightFlag >= INP_PUSH)
{
if((cx += speed) > 600.0f - 35.0f)
cx = 600.0f -35.0f;
}
if(DownFlag >= INP_PUSH)
{
//if((cy += speed) > 464.0f )
//cy = 464.0f;
if((cy += speed) > 600.0f - 60.0f )
cy = 600.0f - 60.0f;
}
}
//クリーン・アップ処理//
VOID CleanUp()
{
RELEASE(texture); //テクスチャの開放
RELEASE(g_pVB); //バーテックスバッファの開放
RELEASE(g_pd3dDevice); //デバイス開放
RELEASE(g_pD3D); //DirectX9開放
}
//シーンの描画//
VOID Render()
{
KeyProc();
//g_pd3dDeviceのNULLチェック if (NULL == g_pd3dDevice) return ;
//バックバッファの背景色を設定してクリア g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//シーンを開始 g_pd3dDevice->BeginScene();
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,true); g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
CUSTOMVERTEX g_Vertices [] = {
{cx - 30.0f,cy - 30.0f,cz,1.0f,0xFFFFFF00,0.0f,0.0f},
{cx + 30.0f,cy - 30.0f,cz,1.0f,0xFF00FF00,1.0f,0.0f},
{cx + 30.0f,cy + 30.0f,cz,1.0f,0xFFFFFFFF,1.0f,1.0f},
{cx - 30.0f,cy + 30.0f,cz,1.0f,0xFF0000FF,0.0f,1.0f}
};
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX)); //g_pd3dDevice->SetVertexShader(D3DFVF_CUSTOMVERTEX);
//テクスチャーをセット g_pd3dDevice->SetTexture(0,texture); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); //g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,g_Vertices,sizeof(CUSTOMVERTEX));
//シーンの終了 g_pd3dDevice->EndScene();
//シーンの描画 g_pd3dDevice->Present(NULL,NULL,NULL,NULL); }
//ウィンドウメッセージの処理//
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE: //キャラの初期位地の設定 cx = 304.0f; cy = 464.0f; cz = 0.5f; speed = 5.0f; return 0;
case WM_DESTROY: //ウィンドウが破棄された場合 PostQuitMessage(0); return 0; case WM_PAINT: //描画の必要がある場合
//シーンの描画//
Render();
ValidateRect(hWnd,NULL);
return 0;
//case WM_KEYDOWN:
// if(wParam == VK_UP)
// {
// InitVB2();
// //シーンの描画//
// Render();
// ValidateRect(hWnd,NULL);
// }else if(wParam == VK_DOWN){
// InitVB();
// //シーンの描画//
// Render();
// ValidateRect(hWnd,NULL);
// }
default:
//デフォルト処理
return DefWindowProc(
hWnd,
uMsg,
wParam,
lParam
);
}
}
/**********************************
WinMain処理
***********************************/
int WINAPI WinMain(
//int APIENTRY WinMain( //APIENTRYと書いても動くらしい
HINSTANCE hInstance, //ウィンドウを生成する為に必要なインスタンスハンドル
HINSTANCE hPrevInstance, //Win16の名残。常にNULL
LPSTR lpCmdLine, //コマンドライン引数
int nCmdShow //ウィンドウの表示をどのようにするかを指定する
)
{
//ウィンドウクラスの初期化//
if (FAILED(InitWindow(hInstance)))
{
MessageBox(
NULL,
TEXT("(;゚Д゚)ウィンドウクラスの初期化に失敗しました! "),
NULL,
MB_OK | MB_ICONSTOP
);
return 0;
}
//Direct3Dの初期化//
if (SUCCEEDED(InitDirect()))
{
//ウィンドウを画面に表示// ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd);
//メッセージ・ループ
MSG msg;
ZeroMemory(&msg,sizeof MSG);
while (msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
Render();
}
}
}
//クリーンアップ// CleanUp(); UnregisterClass(API_NAME,hInstance); return 0;
////////メッセージボックス関数// //////ReturnValue = MessageBox( ////// NULL, //親ウィンドウ(メッセージボックスを出すウィンドウ)の値を保持 ////// L"これがメッセージボックス(テキスト)だ!", //メッセージ内容 ////// L"メッセージボックス(タイトル)", //メッセージボックスタイトル ////// MB_OK | MB_ICONQUESTION //メッセージボックスのYES NO ボタンなどを決める値。 ////// );
//////
//////return(0); }
テクスチャを貼り付け
//プリプロセッサ命令// //プリプロセッサに直接命令を出している。// //#pragma comment(lib,"d3d9.lib") //libをプログラムに埋め込んでいる //#pragma comment(lib,"d3dx9.lib") //#pragma comment(lib,???)はプログラムにライブラリを埋め込む #pragma warning(disable : 4819)
#include <Windows.h> //WinodwsAPIを使用する為に必要なヘッダーファイル #include <d3d9.h> //DirectX9ヘッダーファイル #include <d3dx9.h> //D3DX9ヘッダーファイル #include <tchar.h> #pragma warning(default : 4819)
//マクロ//
#define API_NAME TEXT("Window Class")
#define RELEASE(x) {if(x){(x)->Release();(x)=NULL;}}
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE |D3DFVF_TEX1)
//プロトタイプ宣言// LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); HRESULT InitWindow(HINSTANCE); //InitWindow関数のプロトタイプ宣言
/*【グローバル変数宣言】*/ HWND hWnd; //HWND型変数 LPDIRECT3D9 g_pD3D = NULL; //Direct3D9オブジェクト LPDIRECT3DDEVICE9 g_pd3dDevice = NULL; //DirectX9デバイス LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; //VertexBufferオブジェクト(ポインタ) //テクスチャー// LPDIRECT3DTEXTURE9 texture = NULL; //キャラのテクスチャ LPDIRECT3DTEXTURE9 texture2 = NULL; //弾のテクスチャ LPDIRECT3DTEXTURE9 texture3 = NULL; //背景のテクスチャ1 LPDIRECT3DTEXTURE9 texture4 = NULL; //背景のテクスチャ2 //スプライト// LPD3DXSPRITE g_pSprite = NULL; //スプライト
//弾のフラグ int shotFlg = 0; D3DXVECTOR3 g_pVect3; //キャラのベクトル
//キャラの情報(x座標,y座標,zバッファ,スピード)
float cx,cy,cz,speed;
float cx2,cy2,cz2,speed2;
//背景の情報(x座標1,2,y座標1,2,zバッファ,スピード)
float bx1,bx2,by1,by2,bz3,speed3;
float bx1_2,bx2_2,by1_2,by2_2,bz3_2,speed3_2;
//構造体//
struct CUSTOMVERTEX{
FLOAT x,y,z,rhw;
DWORD color;
FLOAT tu,tv;
};
//
enum
{
INP_FREE,
INP_PULL,
INP_PUSH,
INP_HOLD
};
///ウィンドウクラスの初期化//
HRESULT InitWindow(HINSTANCE hInstance)
{
//変数宣言//
WNDCLASS wc; //WNDCLASS型変数。ウィンドウクラスの初期化するために必要。
//ウィンドウクラスの初期化// wc.style = CS_HREDRAW | CS_VREDRAW; //スタイル wc.lpfnWndProc = WndProc; //ウィンドウプロシージャ wc.cbWndExtra = 0; //補助メモリ wc.cbClsExtra = 0; //補助メモリ wc.hInstance = hInstance; //インスタンスハンドル wc.hIcon = NULL; //アイコン wc.hCursor = NULL; //カーソル wc.hbrBackground = (HBRUSH)COLOR_BACKGROUND + 1; //背景ブラシ wc.lpszMenuName = NULL; //メニュー名 wc.lpszClassName = API_NAME; //クラス名
//ウィンドウクラスの登録//
if (!RegisterClass(&wc)) {
MessageBox(
NULL,
TEXT("(;゚Д゚)ウィンドウクラスの作成に失敗しました! "),
NULL,
MB_OK | MB_ICONSTOP
);
return E_FAIL; //失敗 }
//ウィンドウの生成//
hWnd = CreateWindow(
API_NAME, //クラス名
TEXT("Window Title"), //ウィンドウタイトル名
WS_OVERLAPPEDWINDOW, //ウィンドウのスタイル
100, //ウィンドウの初期位置(横)
100, //ウィンドウの初期位置(縦)
600, //ウィンドウの幅
600, //ウィンドウの高さ
NULL, //子ウィンドウ作成時、親ウィンドウを指定する場合指定。
NULL, //メニュー設定
hInstance, //インスタンスハンドル
NULL //ウィンドウパラメータ
);
//ウィンドウ生成チェック//
if (hWnd == NULL){
MessageBox(
NULL,
TEXT("(;゚Д゚)ウィンドウクラスの生成に失敗しました! "),
NULL,
MB_OK | MB_ICONSTOP
);
return E_FAIL; //失敗
}
return S_OK; //ウィンドウクラスの初期化成功 }
//DirectX9の初期化//
HRESULT InitDirect()
{
//Direct3D・オブジェクトの生成
//補足:Direct3DCreate9関数でDirect3Dオブジェクトを生成する。
// :この関数に渡す引数はSDKのバージョン。
// :D3D_SDK_VERSIONはSDKのバージョン情報。多分、マクロだと思われ。
// :戻り値は、生成したDirect3Dオブジェクトを返す、生成失敗の場合NULLを返す
if (!(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL; //失敗
}
//現在のディスプレイモードを取得// D3DDISPLAYMODE d3ddm;
//先ほど取得したDirect3Dのメソッド.GetAdapterDisplayModeでディスプレイモードを取得する。
//D3DADAPTER_DEFAULTはプライマリ・ディスプレイ・アダプタになる。
//&d3ddmはD3DDISPLAYMODE型のポインタを渡す。
//GetAdapterDisplayModeメソッドがHRESULT型なので、FAILEDマクロでエラーかを判断する。
if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL; //検出失敗
}
//D3Dデバイスの設定
D3DPRESENT_PARAMETERS d3dpp = {0};
d3dpp.Windowed = TRUE; //TRUE:ウィンドウ モード//FALSE:フルスクリーンモード
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = d3ddm.Format; //現在の画面モードを使用
//D3Dデバイスの生成(HALモード)
if (FAILED(g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice)))
{
//REFモードで再試行
if (FAILED(g_pD3D->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_REF,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice)))
{
MessageBox(
NULL,
TEXT("Direct3Dの初期化に失敗"),
NULL,
MB_OK | MB_ICONSTOP);
return E_FAIL; //D3Dデバイスの生成失敗
}
}
//テクスチャーの読み込み
//if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,TEXT("top_img04.jpg"),&texture)))
// return E_FAIL;
if (FAILED(D3DXCreateTextureFromFileEx(
g_pd3dDevice,
TEXT("chara.png"),
0,0,0,0,
D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED,
D3DX_FILTER_LINEAR,
D3DX_FILTER_LINEAR,
D3DCOLOR_XRGB(255,0,255), //透過の指定キー
NULL,
NULL,
&texture)))
return E_FAIL;
//テクスチャーの読み込み
if (FAILED(D3DXCreateTextureFromFileEx(
g_pd3dDevice,
TEXT("shot.bmp"),
0,0,0,0,
D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED,
D3DX_FILTER_LINEAR,
D3DX_FILTER_LINEAR,
D3DCOLOR_XRGB(0,0,0), //透過の指定キー
NULL,
NULL,
&texture2)))
return E_FAIL;
//テクスチャーの読み込み
if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,TEXT("backimg.bmp"),&texture3)))
return E_FAIL;
//テクスチャーの読み込み
if (FAILED(D3DXCreateTextureFromFile(g_pd3dDevice,TEXT("backimg2.bmp"),&texture4)))
return E_FAIL;
//スプライトの作成 if(FAILED(D3DXCreateSprite(g_pd3dDevice,&g_pSprite))) return E_FAIL;
return S_OK; //DreictXの初期化成功 }
//GetInputKey()
//指定したキーコードの状態をflagに代入します。
VOID GetInputKey(int code,int& flag)
{
if(GetKeyState(code) < 0)
{
if(flag == INP_FREE)
flag = INP_PUSH;
else
flag = INP_HOLD;
}else{
if(flag == INP_PUSH || flag == INP_HOLD)
flag = INP_PULL;
else
flag = INP_FREE;
}
}
//KeyProc()
//キーボード操作の処理
VOID KeyProc()
{
static INT LeftFlag,UpFlag,RightFlag,DownFlag,ZFlag;
GetInputKey(VK_LEFT,LeftFlag);
GetInputKey(VK_UP,UpFlag);
GetInputKey(VK_RIGHT,RightFlag);
GetInputKey(VK_DOWN,DownFlag);
GetInputKey('Z',ZFlag);
if(LeftFlag >= INP_PUSH)
{
if((cx -= speed) < 30.0f)
cx = 30.0f;
}
if(UpFlag >= INP_PUSH)
{
if((cy -= speed) < 30.0f)
cy = 30.0f;
}
if(RightFlag >= INP_PUSH)
{
if((cx += speed) > 600.0f - 35.0f)
cx = 600.0f -35.0f;
}
if(DownFlag >= INP_PUSH)
{
//if((cy += speed) > 464.0f )
//cy = 464.0f;
if((cy += speed) > 600.0f - 60.0f )
cy = 600.0f - 60.0f;
}
if(shotFlg == 0)
{
if(ZFlag >= INP_PUSH)
{
shotFlg = 1;
cx2 = cx;
cy2 = cy - 26.0f;
}
}
}
//クリーン・アップ処理//
VOID CleanUp()
{
RELEASE(g_pSprite); //スプライトの開放
RELEASE(texture); //テクスチャの開放
RELEASE(texture2); //テクスチャの開放
RELEASE(texture3); //テクスチャの開放
RELEASE(g_pVB); //バーテックスバッファの開放
RELEASE(g_pd3dDevice); //デバイス開放
RELEASE(g_pD3D); //DirectX9開放
}
//シーンの描画//
VOID Render()
{
KeyProc();
//g_pd3dDeviceのNULLチェック if (NULL == g_pd3dDevice) return ;
//バックバッファの背景色を設定してクリア g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,0),1.0f,0);
//シーンを開始 g_pd3dDevice->BeginScene();
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,true); g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,false);
g_pd3dDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR); g_pd3dDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
//--スプライトの設定--// /*テクスチャステージの設定*/ //カラー成分の設定 g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_SELECTARG1); g_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE); //アルファ成分の設定 g_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG1); g_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
/*ブレンディングモードの設定*/ g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA); g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
//キャラの頂点情報
CUSTOMVERTEX g_Vertices [] = {
{cx - 30.0f,cy - 30.0f,cz,1.0f,0xFFFFFFFF,0.0f,0.0f},
{cx + 30.0f,cy - 30.0f,cz,1.0f,0xFFFFFFFF,1.0f,0.0f},
{cx + 30.0f,cy + 30.0f,cz,1.0f,0xFFFFFFFF,1.0f,1.0f},
{cx - 30.0f,cy + 30.0f,cz,1.0f,0xFFFFFFFF,0.0f,1.0f}
};
//背景の初期化
//if(by1 >= 0)
//{
// by1 = -600;
// by2 = 600;
//}
//背景のスクロールスピード
by1 = by1 + 0.80f;
by2 = by2 + 0.80f;
//背景の頂点情報
CUSTOMVERTEX g_Vertices3 [] = {
{bx1,by1,cz,1.0f,0xFFFFFFFF,0.0f,0.0f},
{bx2,by1,cz,1.0f,0xFFFFFFFF,1.0f,0.0f},
{bx2,by2,cz,1.0f,0xFFFFFFFF,1.0f,1.0f},
{bx1,by2,cz,1.0f,0xFFFFFFFF,0.0f,1.0f}
};
g_pd3dDevice->SetStreamSource(0,g_pVB,0,sizeof(CUSTOMVERTEX));
//背景のテクスチャーをセット g_pd3dDevice->SetTexture(0,texture3); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,g_Vertices3,sizeof(CUSTOMVERTEX));
//if(by1 >= -300)
//{
// by1_2 = by1 - 600 ;
// by2_2 = by2 - 600;
//
// CUSTOMVERTEX g_Vertices4 [] = {
// {bx1,by1_2 - 1200.0f,cz,1.0f,0xFFFFFFFF,0.0f,0.0f},
// {bx2,by1_2 - 1200.0f,cz,1.0f,0xFFFFFFFF,1.0f,0.0f},
// {bx2,by2_2 - 600.00f,cz,1.0f,0xFFFFFFFF,1.0f,1.0f},
// {bx1,by2_2 - 600.00f,cz,1.0f,0xFFFFFFFF,0.0f,1.0f}
// };
// g_pd3dDevice->SetTexture(0,texture4); // g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); // g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,g_Vertices4,sizeof(CUSTOMVERTEX)); //} //
//キャラのテクスチャーをセット g_pd3dDevice->SetTexture(0,texture); g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,g_Vertices,sizeof(CUSTOMVERTEX));
//弾の描画
if (shotFlg == 1)
{
if(cy2 < 16.0f)
{
cy2 = cy;
shotFlg = 0;
}else{
//弾のスピード cy2 = cy2 - 20.0f;
CUSTOMVERTEX g_Vertices2 [] = {
{cx2 - 16.0f,cy2 - 16.0f,cz,1.0f,0xFFFFFFFF,0.0f,0.0f},
{cx2 + 16.0f,cy2 - 16.0f,cz,1.0f,0xFFFFFFFF,1.0f,0.0f},
{cx2 + 16.0f,cy2 + 16.0f,cz,1.0f,0xFFFFFFFF,1.0f,1.0f},
{cx2 - 16.0f,cy2 + 16.0f,cz,1.0f,0xFFFFFFFF,0.0f,1.0f}
};
//g_pd3dDevice->SetStreamSource(0,g_pVB,1,sizeof(CUSTOMVERTEX));
//テクスチャーをセット g_pd3dDevice->SetTexture(0,texture2);
g_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLEFAN,2,g_Vertices2,sizeof(CUSTOMVERTEX));
} }
//シーンの終了 g_pd3dDevice->EndScene();
//シーンの描画 g_pd3dDevice->Present(NULL,NULL,NULL,NULL); }
//ウィンドウメッセージの処理//
LRESULT CALLBACK WndProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE: //キャラの初期位地の設定 cx = 304.0f; cy = 464.0f; cz = 0.5f; speed = 5.0f; //弾の初期位地の設定 cx2 = 304.0f; cy2 = 438.0f; cz2 = 0.5f; speed2 = 5.0f; //背景の初期位地の設定 bx1 = 0.0f; bx2 = 600.0f; by1 = -1800.0f; by2 = 560.0f; bz3 = 0.5f; speed3 = 5.0f;
return 0;
case WM_DESTROY: //ウィンドウが破棄された場合 PostQuitMessage(0); return 0; case WM_PAINT: //描画の必要がある場合
//シーンの描画//
Render();
ValidateRect(hWnd,NULL);
return 0;
//case WM_KEYDOWN:
// if(wParam == VK_UP)
// {
// InitVB2();
// //シーンの描画//
// Render();
// ValidateRect(hWnd,NULL);
// }else if(wParam == VK_DOWN){
// InitVB();
// //シーンの描画//
// Render();
// ValidateRect(hWnd,NULL);
// }
default:
//デフォルト処理
return DefWindowProc(
hWnd,
uMsg,
wParam,
lParam
);
}
}
/**********************************
WinMain処理
***********************************/
int WINAPI WinMain(
//int APIENTRY WinMain( //APIENTRYと書いても動くらしい
HINSTANCE hInstance, //ウィンドウを生成する為に必要なインスタンスハンドル
HINSTANCE hPrevInstance, //Win16の名残。常にNULL
LPSTR lpCmdLine, //コマンドライン引数
int nCmdShow //ウィンドウの表示をどのようにするかを指定する
)
{
//ウィンドウクラスの初期化//
if (FAILED(InitWindow(hInstance)))
{
MessageBox(
NULL,
TEXT("(;゚Д゚)ウィンドウクラスの初期化に失敗しました! "),
NULL,
MB_OK | MB_ICONSTOP
);
return 0;
}
//Direct3Dの初期化//
if (SUCCEEDED(InitDirect()))
{
//ウィンドウを画面に表示// ShowWindow(hWnd,SW_SHOWDEFAULT); UpdateWindow(hWnd);
//メッセージ・ループ
MSG msg;
ZeroMemory(&msg,sizeof MSG);
while (msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
Render();
}
}
}
//クリーンアップ// CleanUp(); UnregisterClass(API_NAME,hInstance); return 0;
////////メッセージボックス関数// //////ReturnValue = MessageBox( ////// NULL, //親ウィンドウ(メッセージボックスを出すウィンドウ)の値を保持 ////// L"これがメッセージボックス(テキスト)だ!", //メッセージ内容 ////// L"メッセージボックス(タイトル)", //メッセージボックスタイトル ////// MB_OK | MB_ICONQUESTION //メッセージボックスのYES NO ボタンなどを決める値。 ////// );
//////
//////return(0); }
2008/12/16 加筆 - papiyon
ゲームプログラミングの館
DXライブラリ(※参照)を使用してゲームの作り方を説明しているサイト。
いろいろと突っ込みたくなるが、確かにこれを見ればDXを使ったゲーム製作の雰囲気は掴めそうだ。
※DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXや
Windows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用の2Dゲーム
ライブラリです。(使用する際はC言語の知識だけで大丈夫です)