x01.Game.Main: 从零开始

一切从零开始,一切皆有可能。

浅墨,90后,《逐梦之旅》深入浅出,堪比大师。

1.安装 DXSDK_June10.exe 或更新版本。

2.运行 vs2012,新建 VC Win32 空项目 x01.Game.Main。

3.在项目属性 Directory 中添加 SDK 中的 Include 和 LibX86。在链接 Input 中添加相关依赖项如:d3d9.lib;d3dx9.lib; 等。

4.添加源文件 Main.cpp,内容如下:

// Main.cpp (2013.11.18 by x01)
//
//  1.安装 DirectX SDK 后,需在项目属性 Directory 中分别导入 SDK 中的 Include 和 LibX86。
//    2.在链接 Input 中添加相关依赖项: d3d9.lib; d3dx9.lib;

#include <Windows.h>
#include <d3d9.h>

#define RELEASE(p)    if ((p) != NULL) { (p)->Release(); (p) = NULL; }

const int ScreenWidth = 640;
const int ScreenHeight = 480;

LPDIRECT3D9 g_D3D = NULL;
LPDIRECT3DDEVICE9 g_Device = NULL;

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
bool InitD3D(HWND hwnd, bool isFullScreen);
void GameRender();
void GameClear();

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR cmdLine, int cmdShow)
{
    WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0, 0, hInstance, NULL, NULL, NULL, NULL, 
        L"x01GameMainClass", NULL };
    RegisterClassEx(&wc);

    HWND hwnd = CreateWindow(L"x01GameMainClass", L"x01 Game", WS_OVERLAPPEDWINDOW, 
        CW_USEDEFAULT, CW_USEDEFAULT, ScreenWidth, ScreenHeight, NULL, NULL, hInstance, NULL);

    UnregisterClass(wc.lpszClassName, wc.hInstance);

    if (!InitD3D(hwnd, false))
    {
        return 0;
    }

    ShowWindow(hwnd, SW_SHOWDEFAULT);
    UpdateWindow(hwnd);
     
    MSG msg;
    ZeroMemory(&msg, sizeof(msg));

    while (msg.message != WM_QUIT)
    {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
            GameRender();
        }
    }

    GameClear();

    return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    case WM_KEYUP:
        if (wParam == VK_ESCAPE)
        {
            PostQuitMessage(0);
        }
        break;
    default:
        break;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);
}

bool InitD3D(HWND hwnd, bool isFullScreen)
{
    g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
    if (g_D3D == NULL)
    {
        MessageBox(hwnd, L"Create D3d failed.", L"Error", MB_OK);
        return false;
    }

    D3DDISPLAYMODE displayMode;
    if (FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
    {
        MessageBox(hwnd, L"Get Adapter Display Mode Failed.", L"Error", MB_OK);
      
        return false;
    }

    D3DPRESENT_PARAMETERS pp;
    ZeroMemory(&pp, sizeof(pp));

    if (isFullScreen)
    {
        pp.Windowed = false;
        pp.BackBufferWidth = ScreenWidth;
        pp.BackBufferHeight = ScreenHeight;
    }
    else
    {
        pp.Windowed = true;
    }

    pp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    pp.BackBufferFormat = displayMode.Format;

    if (FAILED(g_D3D->CreateDevice(
        D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING,&pp,&g_Device) ))
    {
        MessageBox(hwnd, L"Create Device Failed.", L"Error", MB_OK);
        
        
        return false;
    }

    return true;
}

void GameRender()
{
    g_Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
    g_Device->BeginScene();
    g_Device->EndScene();
    g_Device->Present(NULL, NULL, NULL, NULL);
}

void GameClear()
{
    RELEASE(g_Device);
    RELEASE(g_D3D);
}
Main.cp

5.按 F5 调试运行,效果图如下:


          

该程序是对浅墨的高度模仿,但这并不妨碍我们学习。博客不仅是为了分享,更是对自己的一种总结。

以上项目可作为模板保存。什么时候需要新建项目,可将该模板简单 复制 重命名 即可。

原文地址:https://www.cnblogs.com/china_x01/p/3428972.html