DirectX

Last-modified: 2008-12-16 (火) 17:45:00

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