以下コードです。
/********************************************************************/
/* インクルードファイル */
/********************************************************************/
#include"main.h"
#include"polygon.h"
#include"input.h"
#include"game.h"
#include"title.h"
#include"bg.h"
#include"result.h"
/********************************************************************/
/* グローバル変数 */
/********************************************************************/
LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDEVICE = NULL;
LPD3DXFONT g_pD3DFont = NULL;
int g_nCountFPS = 0;
MODE g_mode = MODE_TITLE;
/********************************************************************/
/* メイン関数 */
/********************************************************************/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE nPrevInstance,LPSTR lpcmdLine,int nCmdShow)
{
DWORD dwExecLastTime;
DWORD dwFPSLastTime;
DWORD dwCurrentTime;
DWORD dwFrameCount;
// 分解能を設定
timeBeginPeriod(1);
dwExecLastTime =
dwFPSLastTime = timeGetTime();
dwCurrentTime =
dwFrameCount = 0;
WNDCLASSEX wcex =
{
sizeof(WNDCLASSEX),
CS_CLASSDC, //ウィンドウスタイルを設定
WndProc, //ウィンドウプロシージャのアドレス(関数名)を設定
0,
0,
hInstance, //メイン関数の引数のインスタンスハンドル
NULL, //使用するアイコンを指定
LoadCursor(NULL,IDC_ARROW), //マウスカーソルの指定
(HBRUSH)(COLOR_WINDOW+1), //ウィンドウの背景色の設定(クライアント領域)
NULL, //メニューを設定
"application", //ウィンドウクラスの名前
NULL //使用するスモールアイコンの指定
};
HWND hWnd; //ウィンドウのハンドル
MSG msg; //メッセージ
//ウィンドウクラスの登録
RegisterClassEx(&wcex);
//ウィンドウの生成
hWnd = CreateWindowEx(0,
"application", //ウィンドウクラスの名前
"DirectX", //ウィンドウの名前(キャプションに表示)
WS_OVERLAPPEDWINDOW, //ウィンドウのスタイル
1, //ウィンドウの左上座標(X座標)
1, //ウィンドウの左上座標(Y座標)
1280, //ウィンドウの幅
576, //ウィンドウの高さ
NULL, //親ウィンドウのハンドル
NULL, //メニューハンドルまたは子ウィンドウのID
hInstance, //インスタンスハンドル
NULL);
//初期化処理
if(FAILED(Init(hInstance,hWnd,TRUE)))
{
return -1;
}
InitKeyboard(hInstance, hWnd);
//ウィンドウの表示
ShowWindow(hWnd,nCmdShow); //ウィンドウの表示状態の設定
UpdateWindow(hWnd); //ウィンドウの更新
//メッセージループ
while(1)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE) != 0)
{
if(msg.message == WM_QUIT)
{
break;
}
else
{
//メッセージの翻訳と送出
TranslateMessage(&msg); //翻訳
DispatchMessage(&msg); //送出
}
}
else
{
dwCurrentTime = timeGetTime();
if((dwCurrentTime - dwFPSLastTime) >= 500) // 0.5秒ごとに実行
{
g_nCountFPS = dwFrameCount * 1000 / (dwCurrentTime - dwFPSLastTime);
dwFPSLastTime = dwCurrentTime;
dwFrameCount = 0;
}
if((dwCurrentTime - dwExecLastTime) >= (1000 / 60))
{
dwExecLastTime = dwCurrentTime;
//更新処理
Update();
//描画処理
Draw();
dwFrameCount++;
}
}
}
timeEndPeriod(1);
//ウィンドウクラスの登録解除
UnregisterClass("application",wcex.hInstance);
//終了処理
Uninit();
return 0;
}
/********************************************************************/
/* ウィンドウプロシージャ */
/********************************************************************/
LRESULT CALLBACK WndProc(HWND hWnd, //ウィンドウのハンドル
UINT uMsg, //メッセージ
WPARAM wParam, //パラメータ
LPARAM lParam) //パラメータ
{
int EndCmd;
switch(uMsg)
{
case WM_DESTROY:
PostQuitMessage(0); //WM_QUITメッセージを返す
break;
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
EndCmd = MessageBox(NULL,"アプリケーションを終了させますか?","終了しますか?",MB_YESNO); //終了確認
if(EndCmd == IDYES) //はいが押された場合
{
DestroyWindow(hWnd); //ウィンドウを破棄する
break;
}
}
break;
}
return DefWindowProc(hWnd,uMsg,wParam, lParam);
}
//初期化処理
HRESULT Init(HINSTANCE hInstance,HWND hWnd,BOOL bWindow)
{
D3DDISPLAYMODE d3ddm;
D3DPRESENT_PARAMETERS d3dpp;
//Direct3Dオブジェクトの生成
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(g_pD3D == NULL)
{
return E_FAIL;
}
if(FAILED(g_pD3D -> GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm)))
{
return E_FAIL;
}
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.BackBufferWidth = SCREEN_WIDTH; //画面の幅
d3dpp.BackBufferHeight = SCREEN_HEIGHT; //画面の高さ
d3dpp.BackBufferFormat = d3ddm.Format; //カラーモードの指定
d3dpp.BackBufferCount = 1; //バックバッファの数
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.Windowed = bWindow; //ウィンドウモード/フルスクリーンモード
d3dpp.EnableAutoDepthStencil = TRUE; //デプスバッファ、ステンシルバッファ
d3dpp.AutoDepthStencilFormat = D3DFMT_D16; //デプスバッファとして16bit使用
if(bWindow == TRUE)
{
d3dpp.FullScreen_RefreshRateInHz = 0;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
}
else
{
d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
}
// デバイスオブジェクトの生成
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &g_pD3DDEVICE)))
{
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDEVICE)))
{
if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_REF,hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDEVICE)))
{
return E_FAIL;
}
}
}
//レンダーステートの設定
g_pD3DDEVICE -> SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
g_pD3DDEVICE -> SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
g_pD3DDEVICE -> SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
g_pD3DDEVICE -> SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
// サンプラーステートパラメータの設定
g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); // テクスチャアドレッシング方法(U値)を設定
g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); // テクスチャアドレッシング方法(V値)を設定
g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); // テクスチャ縮小フィルタモードを設定
g_pD3DDEVICE->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); // テクスチャ拡大フィルタモードを設定
//テクスチャステージの設定
g_pD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); // アルファブレンディング処理
g_pD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); // 最初のアルファ引数
g_pD3DDEVICE->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_CURRENT); // 2番目のアルファ引数
Initpolygon();
return S_OK;
}
//デバイスの取得
LPDIRECT3DDEVICE9 GetDevice(void)
{
return g_pD3DDEVICE;
}
//更新処理
void Update(void)
{
UpdateKeyboard();
g_mode = GetMode();
switch(g_mode)
{
case MODE_TITLE:
Updatetitle();
Drawtitle();
break;
case MODE_GAME:
Updategame();
break;
case MODE_RESULT:
Updateresult();
Drawresult();
break;
}
}
//描画処理
void Draw(void)
{
g_pD3DDEVICE -> Clear(0,NULL,(D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER),D3DCOLOR_RGBA(0,0,0,255),1.0f,0);
if(SUCCEEDED(g_pD3DDEVICE -> BeginScene())) //描画の開始
{
g_pD3DDEVICE -> EndScene();
}
g_pD3DDEVICE -> Present(NULL,NULL,NULL,NULL);
}
//終了処理
void Uninit(void)
{
if(g_pD3DDEVICE != NULL)
{
g_pD3DDEVICE -> Release();
g_pD3DDEVICE = NULL;
}
if(g_pD3D != NULL)
{
g_pD3D -> Release();
g_pD3D = NULL;
}
}
//モードの状態
void SetMode(MODE mode)
{
g_mode = mode;
switch(g_mode)
{
case MODE_TITLE:
Uninitresult();
Inittitle();
break;
case MODE_GAME:
Uninittitle();
Initgame();
break;
case MODE_RESULT:
Uninitgame();
Initresult();
}
}
MODE GetMode(void){
return g_mode;
}