zoukankan      html  css  js  c++  java
  • 游戏框架类

    #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);
    //}
  • 相关阅读:
    最后一次不用看脸的日子
    经典算法_指针
    #include <process.h>
    经典算法_文件
    stdin、stdout、stderr
    经典算法_位运算
    经典算法_结构体
    经典算法_字符串
    #include <string.h>
    #include <stdio.h>
  • 原文地址:https://www.cnblogs.com/ketmales/p/2512482.html
Copyright © 2011-2022 走看看