游戏框架类

#ifndef __Direct3DFrameH__
#define __Direct3DFrameH__

#include <Windows.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <MMSystem.h>
#pragma warning(disable:4018)

typedef void (*GAMEINITPROC)(void);
typedef void (*GAMELOGICPROC)(float fElapsedTime);
typedef void (*GAMERENDERPROC)(float fElapsedTime);
typedef void (*GAMECLEARUPPROC)(void);

void CreateDirect3DFrame(WNDPROC WindowProc, IDirect3DDevice9*& pDevice, HWND& hWnd, HINSTANCE hInstance, GAMEINITPROC GameInit, GAMELOGICPROC GameLogic, GAMERENDERPROC GameRender, GAMECLEARUPPROC GameClearUp, int nWidth, int nHeight)
{
    // Register Class
    WNDCLASSW wc;
    ZeroMemory(&wc,sizeof(wc));
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wc.hCursor = LoadCursorW(0, IDC_ARROW);
    wc.hIcon = LoadIconW(0, IDI_APPLICATION);
    wc.hInstance = 0;
    wc.lpfnWndProc = WindowProc;
    wc.lpszClassName = L"ClassName";
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    RegisterClass(&wc);
    // Get Display Mode
    D3DDISPLAYMODE d3ddm;
    ZeroMemory(&d3ddm, sizeof(d3ddm));
    IDirect3D9* pD3D;
    pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);
    // Resize Window Width And Height
    if(nWidth > d3ddm.Width || nWidth < 0) nWidth = d3ddm.Width;
    if(nHeight > d3ddm.Height || nHeight < 0) nHeight = d3ddm.Height;
    // Create Window
    hWnd = CreateWindowW(wc.lpszClassName, L"PLAY", WS_POPUP, (d3ddm.Width - nWidth) / 2, (d3ddm.Height - nHeight) / 2, nWidth, nHeight, 0, 0, hInstance, 0);
    //
    D3DCAPS9 caps;
    pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);
    int vp = 0;
    if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT )
        vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;
    else
        vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
    // Fill Parameter
    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.BackBufferWidth            = nWidth;
    d3dpp.BackBufferHeight           = nHeight;
    d3dpp.BackBufferFormat           = D3DFMT_A8R8G8B8;
    d3dpp.BackBufferCount            = 1;
    d3dpp.MultiSampleType            = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality         = 0;
    d3dpp.SwapEffect                 = D3DSWAPEFFECT_DISCARD; 
    d3dpp.hDeviceWindow              = hWnd;
    d3dpp.Windowed                   = TRUE;
    d3dpp.EnableAutoDepthStencil     = TRUE; 
    d3dpp.AutoDepthStencilFormat     = D3DFMT_D24S8;
    d3dpp.Flags                      = 0;
    d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval       = D3DPRESENT_INTERVAL_ONE;
    // Create Device
    pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, vp, &d3dpp, &pDevice);
    // Init Game
    GameInit();
    // Show Window
    ShowWindow(hWnd, SW_SHOW);
    UpdateWindow(hWnd);
    // Message Loop
    MSG msg;
    ZeroMemory(&msg, sizeof(msg));
    while(msg.message != WM_QUIT)
    {
        if(PeekMessageW(&msg, 0, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessageW(&msg);
        }
        else
        {
            static float fLastTime = (float)timeGetTime();
            float fCurrentTime = (float)timeGetTime();
            float fElapsedTime = (fCurrentTime - fLastTime) * 0.001f;
            GameLogic(fElapsedTime);
            GameRender(fElapsedTime);
            fLastTime = fCurrentTime;
        }
    }
    GameClearUp();
    if(pD3D) pD3D->Release();
    if(pDevice) pDevice->Release();
}

#endif

//#include "Direct3DFrame.h"
//
//// Global Values
//LPDIRECT3D9 g_pD3D;
//LPDIRECT3DDEVICE9 g_pDevice;
//HWND g_hWnd;
//ID3DXMesh* g_pMesh;
//
//
//void GameInit()
//{
//    // Set World Matrix
//    D3DXMATRIX matWorld;
//    D3DXMatrixIdentity(&matWorld);
//    g_pDevice->SetTransform(D3DTS_WORLD, &matWorld);
//    // Set View Matrix
//    D3DXMATRIX matView;
//    D3DXVECTOR3 vEyePos(0.0f, 0.0f, -3.0f);
//    D3DXVECTOR3 vLookAt(0.0f, 0.0f, 0.0f);
//    D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
//    D3DXMatrixLookAtLH(&matView, &vEyePos, &vLookAt, &vUp);
//    g_pDevice->SetTransform(D3DTS_VIEW, &matView);
//    // Set Projection Matrix
//    D3DXMATRIX matProj;
//    D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI * 0.25f, 1366.0f/768.0f, 1.0f, 1000.0f);
//    g_pDevice->SetTransform(D3DTS_PROJECTION, &matProj);
//    // Init Render State
//    g_pDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
//    g_pDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
//    g_pDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
//    // Init 
//    D3DXCreateSphere(g_pDevice, 0.3f, 20, 20, &g_pMesh, NULL);
//}
//
//void GameLogic(float fElapsedTime)
//{
//
//}
//
//void GameRender(float fElapsedTime)
//{
//    g_pDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(123,123,234), 1.0f, 0);
//    g_pDevice->BeginScene();
//        g_pMesh->DrawSubset(0);
//    g_pDevice->EndScene();
//    g_pDevice->Present(NULL, NULL, NULL, NULL);
//}
//
//void GameClearUp()
//{
//    if(g_pMesh) g_pMesh->Release();
//}
//
//LRESULT CALLBACK WindowProc(HWND, int, WPARAM, LPARAM);
//
//int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
//{
//    CreateDirect3DFrame((WNDPROC)WindowProc, g_pDevice, g_hWnd, hInstance, GameInit, GameLogic, GameRender, GameClearUp, 640, 480);
//    return 0;
//}
//
//LRESULT CALLBACK WindowProc(HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
//{
//    if(uMsg == WM_KEYDOWN && wParam == VK_ESCAPE) PostQuitMessage(0);
//    return DefWindowProcW(hWnd, uMsg, wParam, lParam);
//}
原文地址:https://www.cnblogs.com/ketmales/p/2512482.html