|
|
发表于 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-> resent (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);
} |
|