人气 174

[游戏程序] [转帖]DirectX9.0的初级教学 [复制链接]

九艺网 2017-3-10 17:01:05

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x


编程环境VC++6。6
DirectX 9.0 SDK  没有可以去微软官方网站下载
进入C++6。0单击“文件”菜单,选“新建”,在“新建”对话框中选Win32 Application
输入文件名为Mygame1
以下选择空项目,完成既可。
这时新建文件,选择C++ SOURCE 文件。名为本Mygame1


#include <d3d9.h>

#pragma comment(lib,"d3d9.lib")          ///////////缺少这句编译不能通过

LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pD3DDevice = NULL;

HRESULT InitialiseD3D(HWND hWnd)
{
    //创建D3D对象,并获得D3D接口指针
  
    g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(g_pD3D == NULL)
    {
        return E_FAIL;
    }

    //获得当前的显示模式
    D3DDISPLAYMODE d3ddm;
    if(FAILED(g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm)))
    {
        return E_FAIL;
    }


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

     
    //创建窗口模式的D3D
     
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = d3ddm.Format;

    //创建D3D的设备对象,并获取接口IDirect3DDevice9的指针
    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,  
                                   D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp,
                                   &g_pD3DDevice)))
    {
        return E_FAIL;
    }
     
    return S_OK;
}

void Render()
{
    if(g_pD3DDevice == NULL)
    {
        return;
    }

    //用绿色清除后备缓存
    g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
     
    //开始屏幕操作
    g_pD3DDevice->BeginScene();
     
    //我们将在中间完成所有的3D渲染
     
    //结束屏幕操作
    g_pD3DDevice->EndScene();
     
     
    //翻转后备为屏幕,使画面显示在屏幕上
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

void CleanUp()
{
    if(g_pD3DDevice != NULL)
    {
        g_pD3DDevice->Release();
        g_pD3DDevice = NULL;
    }

    if(g_pD3D != NULL)
    {
        g_pD3D->Release();
        g_pD3D = NULL;
    }
}

void GameLoop()
{
    //进入游戏循环
    MSG msg;  
    BOOL fMessage;

    PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
     
    while(msg.message != WM_QUIT)
    {
        fMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE);

        if(fMessage)
        {
            //处理消息
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else
        {
         //没有消息时,处理渲染图象
            Render();
        }

    }
}

//Windows消息处理机制,用来处理各种WINDOWS消息,包括常用的键盘消息
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        break;
        case WM_KEYUP:  
            switch (wParam)
            {  
                case VK_ESCAPE:
                    //按“ESC”键退出
                    DestroyWindow(hWnd);
                    return 0;
                break;
            }  
        break;

    }

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

//应用程序入口主函数,相当于C语言的main()函数
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    //注册窗口类
    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L,  
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "DX9", NULL};
    RegisterClassEx(&wc);

    //创建应用程序窗口
    HWND hWnd = CreateWindow("DX9", "mygame1",  
                              WS_OVERLAPPEDWINDOW, 50, 50, 500, 500,
                              GetDesktopWindow(), NULL, wc.hInstance, NULL);

    //Initialize Direct3D
    if(SUCCEEDED(InitialiseD3D(hWnd)))
    {  
        //显示窗口
        ShowWindow(hWnd, SW_SHOWDEFAULT);
        UpdateWindow(hWnd);

        //开始游戏并循环
        GameLoop();
    }
     
    CleanUp();

    UnregisterClass("DX9", wc.hInstance);
     
    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|小黑屋|九艺游戏动画论坛 ( 津ICP备2022000452号-1 )

GMT+8, 2024-4-25 04:22 , Processed in 0.128858 second(s), 23 queries .

Powered by Discuz! X3.4  © 2001-2017 Discuz Team.