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言語の知識だけで大丈夫です)