main.cpp

説明を見る。
00001 
00002 
00003 
00004 #include "main.h"
00005 #include "DrawMain.h"
00006 
00007 //DirectX版ならば
00008 #ifndef __NOT_USE_DIRECTX
00009 
00010 //============================================================================
00011 //DirectXのヘッダ
00012 //============================================================================
00013 #include <d3d9.h>
00014 #include <d3dx9.h>
00015 
00016 //============================================================================
00017 //DirectXのリンクライブラリ
00018 //============================================================================
00019 #pragma comment(lib, "d3d9.lib")
00020 #pragma comment(lib, "d3dx9.lib")
00021 
00022 //============================================================================
00023 //DirectX用外部公開変数
00024 //============================================================================
00025 LPDIRECT3D9                             pD3D            = NULL; 
00026 LPDIRECT3DDEVICE9               pD3DDevice      = NULL; 
00027 LPD3DXSPRITE                    pSprite         = NULL; 
00028 LPD3DXFONT                              lpFont          = NULL; 
00029 D3DPRESENT_PARAMETERS   d3dpp;                          
00030 
00031 #endif
00032 
00033 //============================================================================
00034 //Windows用外部公開変数
00035 //============================================================================
00036 HWND                                    hWindow         = NULL; 
00037 HINSTANCE                               hInstance       = NULL; 
00038 RECT                                    rcClientRect;           
00039 
00040 //============================================================================
00041 //シンボル定義
00042 //============================================================================
00043 #define WINDOW_WIDTH            640                             
00044 #define WINDOW_HEIGHT           480                             
00045 
00046 
00047 //============================================================================
00048 // 関数プロトタイプ宣言
00049 //============================================================================
00050 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);           
00051 
00052 //DirectX版ならば
00053 #ifndef __NOT_USE_DIRECTX
00054 
00055 HRESULT InitD3D(HWND hWnd);                                                                                                                     
00056 void ReleaseD3D();                                                                                                                                      
00057 void InitRenderState();                                                                                                                         
00058 void InitAnotherState();                                                                                                                        
00059 
00060 #endif
00061 
00062 //============================================================================
00073 //============================================================================
00074 int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int nCmdShow)
00075 {
00076         HWND hWnd = NULL;               //一時的なウインドウハンドル
00077         MSG msg;                                //メッセージ受け取り用
00078 
00079         // ウインドウの初期化
00080         static char szAppName[] = "実験用サンプル";
00081         WNDCLASSEX wc;
00082         wc.cbSize                       = sizeof(wc);                                                   //構造体のサイズ
00083         wc.style                        = CS_HREDRAW | CS_VREDRAW;                              //スタイル
00084         wc.lpfnWndProc          = WndProc;                                                              //メッセージプロシージャのアドレス
00085         wc.cbClsExtra           = 0;                                                                    //拡張メモリ
00086         wc.cbWndExtra           = 0;                                                                    //拡張ウインドウメモリ
00087         wc.hInstance            = hInst;                                                                //インスタンス
00088         wc.hIcon                        = LoadIcon(NULL, IDI_APPLICATION);              //タイトルバーのアイコン
00089         wc.hCursor                      = LoadCursor(NULL, IDC_ARROW);                  //カーソル
00090         wc.hbrBackground        = (HBRUSH)GetStockObject(BLACK_BRUSH);  //背景色
00091         wc.lpszMenuName         = NULL;                                                                 //メニューのリソース
00092         wc.lpszClassName        = szAppName;                                                    //アプリケーション名
00093         wc.hIconSm                      = LoadIcon(NULL, IDI_ASTERISK);                 //拡張カーソル
00094 
00095         //ウインドウ登録
00096         if(!RegisterClassEx(&wc))
00097                 return 0;
00098 
00099         //ウインドウサイズの調整(普通に作成するとタイトルバーなどでクライアント領域が少なくなる)
00100         rcClientRect.right      = WINDOW_WIDTH;
00101         rcClientRect.bottom = WINDOW_HEIGHT;
00102         AdjustWindowRect(&rcClientRect,                 //調整したいウインドウのサイズ
00103                                         WS_OVERLAPPEDWINDOW,    //ウインドウのスタイル
00104                                         FALSE                                   //メニューの有無
00105                                         );
00106 
00107         //ウインドウ作成
00108         hWnd = CreateWindow(szAppName,                                                          //アプリケーション名(wc.lpszClassNameと一緒じゃないと駄目)
00109                                                 szAppName,                                                              //タイトルバーの文字
00110                                                 WS_OVERLAPPEDWINDOW,                                    //ウインドウのスタイル
00111                                                 CW_USEDEFAULT, CW_USEDEFAULT,                   //ウインドウのX,Y
00112                                                 rcClientRect.right - rcClientRect.left, //ウインドウの幅
00113                                                 rcClientRect.bottom - rcClientRect.top, //ウインドウの高さ
00114                                                 NULL, NULL, hInst, NULL);
00115         if(hWnd == NULL)
00116                 return 0;
00117 
00118         ShowWindow(hWnd, SW_SHOW);                                                                      //ウインドウの表示
00119         UpdateWindow(hWnd);                                                                                     //ウインドウの更新
00120 
00121         hWindow = hWnd;                                                                                         //グローバル変数に格納
00122         hInstance = hInst;                                                                                      //グローバル変数に格納
00123 
00124 #ifndef __NOT_USE_DIRECTX
00125         // Direct3Dの初期化関数を呼ぶ
00126         if(FAILED(InitD3D(hWnd)))
00127         {
00128                 return 0;
00129         }
00130 #endif
00131 
00132         //シーンの初期化
00133         FrameInit();
00134 
00135         // メッセージループ
00136         ZeroMemory(&msg, sizeof(msg));
00137         while(msg.message != WM_QUIT)
00138         {
00139                 //メッセージがあるか調べる
00140                 if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
00141                 {
00142                         TranslateMessage(&msg);                                 //メッセージの変換
00143                         DispatchMessage(&msg);                                  //メッセージの割り当て
00144                 }
00145                 else
00146                 {
00147                         //シーンの処理
00148                         DrawFrame();
00149                         //CPUを占有しないようにOSへ優先度を渡す
00150                         Sleep(1);
00151                 }
00152         }
00153 
00154         //シーンの開放
00155         FrameRelease();
00156 #ifndef __NOT_USE_DIRECTX
00157         //Direct3Dの開放
00158         ReleaseD3D();
00159 #endif
00160 
00161         return (int)msg.wParam;
00162 }
00163 
00164 
00165 
00166 //============================================================================
00176 //============================================================================
00177 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
00178 {
00179         //アプリ固有プロシージャで処理があったか
00180         if(!MyWndProc(hWnd,uMsg,wParam,lParam))
00181                 return 0;
00182         
00183         switch(uMsg)
00184         {
00185                 //ウインドウが消えるとき
00186                 case WM_DESTROY:
00187                         PostQuitMessage(0);
00188                         return 0;
00189                 //キーが押されたとき
00190                 case WM_KEYDOWN:
00191                         if(wParam == VK_ESCAPE)
00192                                 PostMessage(hWnd,WM_CLOSE,0,0);
00193                         return 0;;
00194         }
00195 
00196         //何も処理されなければデフォルトの処理を行う
00197         return DefWindowProc(hWnd, uMsg, wParam, lParam);
00198 }
00199 
00200 //DirectX版ならば
00201 #ifndef __NOT_USE_DIRECTX
00202 
00203 //============================================================================
00209 //============================================================================
00210 HRESULT InitD3D(HWND hWnd)
00211 {
00212         // Direct3Dオブジェクトの作成
00213         pD3D = Direct3DCreate9(D3D_SDK_VERSION);
00214         if(pD3D == NULL)
00215         {
00216                 MessageBox(0, "Direct3Dの作成に失敗しました", "", MB_OK);
00217                 return E_FAIL;
00218         }
00219 
00220         // Direct3Dデバイスオブジェクトの作成(ウインドウモード)
00221         ZeroMemory(&d3dpp, sizeof(d3dpp));
00222         d3dpp.BackBufferFormat                          = D3DFMT_UNKNOWN;                                               //バックバッファフォーマット(暫定値)
00223         d3dpp.BackBufferCount                           = 1;                                                                    //バックバッファの数
00224         d3dpp.SwapEffect                                        = D3DSWAPEFFECT_DISCARD;
00225         d3dpp.Windowed                                          = TRUE;                                                                 //ウインドウモード
00226         d3dpp.EnableAutoDepthStencil            = TRUE;
00227         d3dpp.AutoDepthStencilFormat            = D3DFMT_D16;                                                   //暫定値
00228         d3dpp.PresentationInterval                      = D3DPRESENT_INTERVAL_DEFAULT;                  //FPS管理を行う
00229 //      d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;                                     //FPS管理を行わない
00230 
00231         // Direct3Dデバイスオブジェクトの作成(フルスクリーン)
00232         //D3DPRESENT_PARAMETERS d3dpp;
00233         //ZeroMemory(&d3dpp, sizeof(d3dpp));
00234         //D3DDISPLAYMODE DMode;
00235         //pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &DMode);
00236         //d3dpp.BackBufferFormat = DMode.Format;
00237         //d3dpp.BackBufferWidth = WINDOW_WIDTH;
00238         //d3dpp.BackBufferHeight = WINDOW_HEIGHT;
00239         //d3dpp.BackBufferCount = 1;
00240         //d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
00241         //d3dpp.Windowed = FALSE;
00242         //d3dpp.EnableAutoDepthStencil = TRUE;
00243         //d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
00244         //d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
00245         //d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
00246 
00247 
00248         //デバイスの作成
00249         //HardWare,HardWare
00250         if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
00251                 D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pD3DDevice)))
00252         {
00253                 //HardWare,SoftWare
00254                 if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
00255                         D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pD3DDevice)))
00256                 {
00257                         //SoftWare,HardWare
00258                         MessageBox(0, "HALモードでDirect3Dデバイスを作成できません¥nREFモードで再試行します", NULL, MB_OK);
00259                         if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
00260                                 D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pD3DDevice)))
00261                         {
00262                                 //SoftWare,SoftWare
00263                                 if(FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, hWnd,
00264                                         D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pD3DDevice)))
00265                                 {
00266                                         MessageBox(0, "Direct3Dデバイスの作成に失敗しました", NULL, MB_OK);
00267                                         return E_FAIL;
00268                                 }
00269                         }
00270                 }
00271         }
00272 
00273         //描画モードの設定(デフォルト設定)
00274         InitRenderState();
00275         //描画モードの設定(アプリ固有設定)
00276         InitAnotherState();
00277 
00278         return S_OK;
00279 }
00280 
00281 //============================================================================
00286 //============================================================================
00287 void InitRenderState()
00288 {
00289         // レンダリング・ステートを設定
00290         // Z バッファ有効化->前後関係の計算を正確にしてくれる
00291         pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);
00292         pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE,TRUE);
00293 
00294         // アルファブレンディング有効化
00295         pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
00296 
00297         // アルファブレンディング方法を設定
00298         pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
00299         pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
00300 
00301         // レンダリング時のアルファ値の計算方法の設定
00302         pD3DDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
00303         // テクスチャの色を使用
00304         pD3DDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE);
00305         // 頂点の色を使用
00306         pD3DDevice->SetTextureStageState(0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE);
00307         // レンダリング時の色の計算方法の設定
00308         pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
00309 
00310         //裏面カリング
00311         pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
00312 //      pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
00313 //      pD3DDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CW);
00314 
00315         // フィルタ設定
00316         pD3DDevice->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINEAR);
00317         pD3DDevice->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);
00318         pD3DDevice->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINEAR);
00319 
00320         //ライトの計算をするか
00321         pD3DDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
00322 //      pD3DDevice->SetRenderState(D3DRS_LIGHTING,FALSE);
00323 
00324         //面の塗りつぶしなし(ワイヤーフレーム)
00325 //      pD3DDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);//D3DFILL_SOLID で元に戻る
00326 
00327 }
00328 
00329 //============================================================================
00333 //============================================================================
00334 void InitAnotherState()
00335 {
00336         //ライトの設定
00337         D3DLIGHT9 Light;
00338         ZeroMemory(&Light,sizeof(D3DLIGHT9));
00339         Light.Type = D3DLIGHT_DIRECTIONAL;      //ライトの種類(ディレクショナルライト)
00340         Light.Diffuse.a = 1.0f;
00341         Light.Diffuse.r = 1.0f;                         //色
00342         Light.Diffuse.g = 1.0f;
00343         Light.Diffuse.b = 1.0f;
00344         Light.Direction = D3DXVECTOR3(1.0f,-1.0f,-1.0f);//光が進む方向(ポイントライトではいらない)
00345 
00346         //ポイントライト設定
00347 //      Light.Type = D3DLIGHT_POINT;            //ポイントライト
00348 //      Light.Position = D3DXVECTOR3(0,0,0);//位置
00349 //      Light.Range = 10;                                               //光の計算を行う半径
00350         //光の計算に使う(大きいほど光が届きにくくなる)
00351 //      Light.Attenuation0 = 0;
00352 //      Light.Attenuation1 = 0.2f;                      //これだけを設定するのが一般的(距離が適度に生きてくるから)
00353 //      Light.Attenuation2 = 0;
00354 
00355         //ライトをセット
00356         pD3DDevice->SetLight(0,&Light);
00357         //ライトの有効
00358         pD3DDevice->LightEnable(0,TRUE);
00359 
00360         //スプライト作成
00361         D3DXCreateSprite(pD3DDevice,&pSprite);
00362 
00363         //フォント設定
00364         D3DXCreateFont(pD3DDevice,16,0,1000,1,                  //デバイス,高さ(0でデフォルト),幅(0でデフォルト),太さ,?
00365                                         FALSE,                                                  //斜体,
00366                                         SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,//基本的にいじらなくていい
00367                                         NULL,                                                   //フォント名(NULLでデフォルト)
00368                                         &lpFont
00369                                         );
00370         lpFont->OnResetDevice();//文字表示に必ずいる
00371 }
00372 
00373 //============================================================================
00377 //============================================================================
00378 void ReleaseD3D()
00379 {
00380         SAFE_RELEASE(lpFont);
00381         SAFE_RELEASE(pSprite);
00382         SAFE_RELEASE(pD3DDevice);
00383         SAFE_RELEASE(pD3D);
00384 }
00385 
00386 #endif

FPStestに対してWed Nov 14 09:55:20 2007に生成されました。  doxygen 1.5.2