[DirectX游戏开发笔记] 二、最简单的DirectX

#include<d3d9.h>

#pragma comment(lib, "d3d9.lib")

#pragma comment(lib, "d3dx9.lib")



#define WINDOW_CLASS "UGPDX"

#define WINDOW_NAME "DirectX9 应用程序"



bool InitializeD3D(HWND hWnd, bool fullscreen);

void RenderScene();

void Shutdown();



// Direct3D object and device.

LPDIRECT3D9 g_D3D = NULL;

LPDIRECT3DDEVICE9 g_D3DDevice = NULL;





LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

    switch(msg)

    {

    case WM_DESTROY:

        PostQuitMessage(0);

        return 0;

        break;

    case WM_KEYUP:

        if(wParam == VK_ESCAPE)

            PostQuitMessage(0);

        break;

    }

    return DefWindowProc(hWnd, msg, wParam, lParam);

}



int WINAPI WinMain(HINSTANCE hInst, HINSTANCE prevhInst, LPSTR cmdLine, int show)

{

    // 注册窗体类

    WNDCLASSEX wcex = { 0 };

    wcex.cbSize = sizeof(WNDCLASSEX);

    wcex.style  = CS_HREDRAW | CS_VREDRAW;

    wcex.lpfnWndProc   = WndProc;

    wcex.cbClsExtra       = 0;

    wcex.cbWndExtra       = 0;

    wcex.hInstance     = hInst;

    wcex.hIcon         = NULL;

    wcex.hCursor       = NULL;

    wcex.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);

    wcex.lpszMenuName  = NULL;

    wcex.lpszClassName = WINDOW_CLASS;

    RegisterClassEx(&wcex);



    // 创建应用程序窗体

    HWND hWnd = CreateWindow(

        WINDOW_CLASS,         //类名

        WINDOW_NAME,          //窗体标题

        WS_OVERLAPPEDWINDOW,  //窗体样式

        100,                  //X坐标

        100,                  //Y坐标

        640,                  //窗体宽

        480,                  //窗体高

        GetDesktopWindow(),   //父窗体句柄

        NULL,                 //菜单栏

        hInst,                //实例

        NULL                  //创建参数

        );



    // 初始化Direct3D

    if (!InitializeD3D(hWnd, false))

        return 0;



    // 显示窗体

    ShowWindow(hWnd, SW_SHOWDEFAULT);

    UpdateWindow(hWnd);



    // 进入消息循环

    MSG msg = {0};

    while(msg.message != WM_QUIT)

    {

        if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))

        {

            TranslateMessage(&msg);

            DispatchMessage(&msg);

        }

        else

            RenderScene();

    }



    // 释放所有资源

    Shutdown();



    // 卸载窗口

    UnregisterClass(WINDOW_CLASS, hInst);

    return 0;

}



bool InitializeD3D(HWND hWnd, bool fullscreen)

{

    D3DDISPLAYMODE displayMode;



    // 创建D3D对象

    g_D3D = Direct3DCreate9(D3D_SDK_VERSION);

    if(g_D3D == NULL) return false;



    // 获取桌面显示模式

    if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))

        return false;



    // 设置用来创建D3DDevice的结构体

    D3DPRESENT_PARAMETERS d3dpp = {0};



    d3dpp.Windowed = !fullscreen;  //是否全屏显示

    d3dpp.BackBufferWidth = 640;   //后台缓存的宽度

    d3dpp.BackBufferHeight = 480;  //后台缓存的高度

    d3dpp.Windowed = TRUE;

    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

    d3dpp.BackBufferFormat = displayMode.Format;



    // 创建D3DDevice

    HRESULT hResult = g_D3D->CreateDevice(

        D3DADAPTER_DEFAULT,   //用于指定正在使用的显卡

        D3DDEVTYPE_HAL,       //硬件渲染D3DDEVTYPE_HAL,软件渲染D3DDEVTYPE_REF,不需要软硬件支持的D3DDEVTYPE_NULLREF,或是采用要进行渲染工作的可插拔软件的D3DDEVTYPE_SW

        hWnd,                 //窗口句柄

        D3DCREATE_SOFTWARE_VERTEXPROCESSING, //指定设备的运行方式

        &d3dpp,               //指向D3DPRESENT_PARAMTERS结构

        &g_D3DDevice          //指向新创建的Direct3D设备对象

        );



    if(FAILED(hResult))

    {

        return false;

    }

    return true;

}



void RenderScene()

{

    // 清空后台缓冲

    g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);



    // 开始渲染

    g_D3DDevice->BeginScene();



    // 这里添加渲染代码



    // 结束渲染

    g_D3DDevice->EndScene();



    // 显示场景

    g_D3DDevice->Present(NULL, NULL, NULL, NULL);

}



void Shutdown()

{

    if(g_D3DDevice != NULL) g_D3DDevice->Release();

    if(g_D3D != NULL) g_D3D->Release();

}
WinMain.cpp 源代码

本节源代码请点击这里下载 DirectXCode2.zip

你可能感兴趣的:(游戏开发)