游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3545|回复: 1

如何在VC++6.0中用DirectX9.0 SDK创建一个D3D游戏的框架

[复制链接]

2

主题

13

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2006-2-15 11:18:00 | 显示全部楼层 |阅读模式
     各位大狭小弟想请教如何在VC++6.0中用DirectX9.0 SDK创建一个D3D游戏的框架。
请各位多多指教abc [em24]

27

主题

93

帖子

106

积分

注册会员

Rank: 2

积分
106
发表于 2006-5-1 16:53:00 | 显示全部楼层

Re:如何在VC++6.0中用DirectX9.0 SDK创建一个D3D游戏的框架

#include <d3d9.h>
#pragma comment(lib,"d3d9.lib")

struct POINTVERTEX
{
        float x,y,z,rhw;
        DWORD color;
};


HWND                                        g_hWnd                        = NULL;
IDirect3D9                                *g_pD3D                        = NULL;
IDirect3DDevice9                *g_pDevice                = NULL;
IDirect3DVertexBuffer9        *g_pVertex                = NULL;

bool InitD3D(HWND hWnd);
bool InitVertex(float x1,float y1,float x2,float y2,DWORD color);
void Render();
void Cleanup();
bool InitInstance(HINSTANCE hInstance);
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);


int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        MSG msg;

        if(!InitInstance(hInstance))
                return false;

        if(!InitD3D(g_hWnd))
                return false;

        if(!InitVertex(150.0f,50.0f,250.0f,250.0f,0xff00ff00))
                return false;

        ShowWindow(g_hWnd,SW_SHOW);
        UpdateWindow(g_hWnd);

        while(GetMessage(&msg,NULL,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }

        Cleanup();
        return (int)msg.wParam ;
}

bool InitInstance(HINSTANCE hInstance)
{
        WNDCLASS wc;
        wc.cbClsExtra                = 0;
        wc.cbWndExtra                = 0;
        wc.hbrBackground        = (HBRUSH)(COLOR_WINDOW + 1);
        wc.hCursor                        = LoadCursor(NULL,IDC_ARROW);
        wc.hIcon                        = LoadIcon(NULL,IDI_WINLOGO);
        wc.hInstance                = hInstance;
        wc.lpfnWndProc                = (WNDPROC)WndProc;
        wc.lpszClassName        = "d3d";
        wc.lpszMenuName                = 0;
        wc.style                        = 0;
        RegisterClass(&wc);

        g_hWnd = CreateWindow("d3d","3d demo",WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
                NULL,NULL,hInstance,NULL);


        return true;
}

bool InitD3D(HWND hWnd)
{
        if(NULL==(g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
                return false;

        D3DDISPLAYMODE d3ddm;
        if(FAILED(g_pD3D->GetAdapterDisplayMode (D3DADAPTER_DEFAULT,&d3ddm)))
                return false;

        D3DPRESENT_PARAMETERS d3ddp;
        memset(&d3ddp,0,sizeof(d3ddp));
        d3ddp.Windowed                        = true;
        d3ddp.SwapEffect                = D3DSWAPEFFECT_DISCARD;
        d3ddp.BackBufferFormat        = d3ddm.Format ;

        if(FAILED(g_pD3D->CreateDevice (D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hWnd,
                                                                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                        &d3ddp,&g_pDevice)))
        {
                return false;
        }

        return true;
}

bool InitVertex(float x1,float y1,float x2,float y2,DWORD color)
{
        POINTVERTEX PointVertex[] =
        {
                { x1, y1, 1.0f, 1.0f, color},
                { x2, y2, 1.0f, 1.0f, color}
        };

        if(FAILED(g_pDevice->CreateVertexBuffer ( 2 * sizeof(POINTVERTEX),0,
                                                                                          D3DFVF_XYZRHW | D3DFVF_DIFFUSE,
                                                                                          D3DPOOL_DEFAULT,&g_pVertex,NULL)))
        {
                return false;
        }

        VOID *pVertices;
        if(FAILED(g_pVertex->Lock (0,sizeof(PointVertex),(void**)&pVertices,0)))
                return false;

        memcpy(pVertices,PointVertex,sizeof(PointVertex));
        g_pVertex->Unlock ();

        return true;
}

void Render()
{
        g_pDevice->Clear (0, NULL, D3DCLEAR_TARGET ,D3DCOLOR_XRGB(255,0,0),1.0f,0);

        g_pDevice->BeginScene ();
        g_pDevice->SetFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
        g_pDevice->SetStreamSource (0, g_pVertex,0,sizeof(POINTVERTEX));
        g_pDevice->DrawPrimitive (D3DPT_LINELIST ,0,1);
        g_pDevice->EndScene ();

        g_pDevice-&gtresent (NULL,NULL,NULL,NULL);
}


void Cleanup()
{
        if(g_pVertex != NULL)
                g_pVertex->Release ();

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

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

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
        switch(message)
        {
        case WM_PAINT:
                Render();
                ValidateRect(g_hWnd,NULL);
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        }
        return DefWindowProc(hWnd,message,wParam,lParam);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 10:01

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表