|

楼主 |
发表于 2010-9-12 19:58:39
|
显示全部楼层
- #include<d3d9.h>
- #include<d3dx9.h>
- // Direct3D object and device.
- LPDIRECT3D9 g_D3D = NULL;
- LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
- // 定义了一个顶点缓存对象
- LPDIRECT3DVERTEXBUFFER9 g_VertexBuffer = NULL;
- // 定义场景中单个3D点的结构
- struct stD3DVertex
- {
- float x, y, z, rhw; // 点的x,y,z坐标值
- unsigned long color; // 点的颜色
- };
- // 定义顶点格式标识符,即灵活顶点格式
- #define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
- // 初始化Direct3D
- bool InitializeD3D(HWND hWnd, bool fullscreen)
- {
- D3DDISPLAYMODE displayMode;
- // 创建Direct3D接口对象
- g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
- if(g_D3D == NULL) return false;
- // 获得当前显卡的显示模式
- if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
- return false;
- // 建立D3DPRESENT_PARAMETERS结构,用于定义Direct3D窗口的显示信息
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory(&d3dpp, sizeof(d3dpp));
- if(fullscreen)
- {
- d3dpp.Windowed = FALSE;
- d3dpp.BackBufferWidth = 1024;
- d3dpp.BackBufferHeight = 768;
- //判断系统分辨率是否大于游戏所需分辨率
- if ((GetSystemMetrics(SM_CXSCREEN) < 1024) || (GetSystemMetrics(SM_CYSCREEN) < 768))
- MessageBox(NULL,"当前系统分辨率小于1024×768", "Error", MB_OK | MB_ICONERROR | MB_SYSTEMMODAL);
- }
- else
- d3dpp.Windowed = TRUE;
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = displayMode.Format;
- // Create the D3DDevice
- if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
- D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_D3DDevice)))
- {
- return false;
- }
- return true;
- }
- // 用于创建演示程序中要绘制在屏幕上的物体
- bool InitializeObjects()
- {
- unsigned long col = D3DCOLOR_XRGB(255, 255, 255);
- // Fill in our structure to draw an object.
- // x, y, z, rhw, color.
- // objData结构体数组:设置所有点的数据
- stD3DVertex objData[] =
- {
- // 点坐标及颜色的数据
- { 420.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 255, 0), },
- { 420.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 255), },
- { 220.0f, 150.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 255), },
- { 220.0f, 350.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(90, 255, 90), },
- };
- // 创建顶点缓存
- if(FAILED(g_D3DDevice->CreateVertexBuffer(sizeof(objData), 0,
- D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,
- NULL))) return false;
- // Fill the vertex buffer.
- void *ptr;
- // 锁定顶点缓存,以进行读写操作
- if(FAILED(g_VertexBuffer->Lock(0, sizeof(objData),
- (void**)&ptr, 0))) return false;
-
- // 将数据复制到该缓存中
- memcpy(ptr, objData, sizeof(objData));
- // 对顶点缓存进行解锁
- g_VertexBuffer->Unlock();
- return true;
- }
- void RenderScene()
- {
- // 清空后台缓存
- g_D3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0);
- // 开始绘制,开始渲染
- g_D3DDevice->BeginScene();
- // 设置顶点数据流的输入源
- g_D3DDevice->SetStreamSource(0, g_VertexBuffer, 0,
- sizeof(stD3DVertex));
- g_D3DDevice->SetFVF(D3DFVF_VERTEX); // 设置顶点格式
- g_D3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); // 进行绘制
- //第一个参数是图元类型
- //点列 D3DPT_POINTLIST
- //线列 D3DPT_LINELIST(例如:点1和点2连接,点3和点4连接)
- //线带 D3DPT_LINESTRIP(例如:点1和点2相连,点2和点3相连)
- //三角形列 D3DPT_TRIANGLELIST(例如:点1、点2和点3构成一个三角形,而点4、点5和点6构成另一个三角形)
- //三角形带 D3DPT_TRIANGLESTRIP(例如:点1、点2和点3构成一个三角形,点2、点3和点4构成另一个三角形)
- //三角形扇 D3DPT_TRIANGLEFAN(例如:点1、点2和点3构成一个三角形,而点1、点3和点4构成另一个三角形)
- // 结束绘制,停止渲染
- 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();
- if(g_VertexBuffer != NULL) g_VertexBuffer->Release();
-
- g_D3DDevice = NULL;
- g_D3D = NULL;
- g_VertexBuffer = NULL;
- }
- // 窗口过程函数(系统自动调用,即回调函数)
- LRESULT WINAPI MsgProc(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 wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
- GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
- "DirectX_GAME", NULL };
- RegisterClassEx(&wc);
- // 创建这个注册好的应用程序窗口
- HWND hWnd = CreateWindow("DirectX_GAME", "DirectX_Project", WS_OVERLAPPEDWINDOW,
- 0, 0, 1024, 768, GetDesktopWindow(), NULL,
- wc.hInstance, NULL);
- // 隐藏鼠标指针
- ShowCursor(FALSE);
- // 初始化 Direct3D
- if(InitializeD3D(hWnd, true)&&InitializeObjects())
- {
- // 显示该窗口
- ShowWindow(hWnd, SW_SHOWDEFAULT);
- UpdateWindow(hWnd);
- // 进入消息循环
- MSG msg;
- ZeroMemory(&msg, sizeof(msg));
- while(msg.message != WM_QUIT)// 只要不是退出命令,就一直循环
- {
- // 从消息队列中获取下一条消息
- if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
- {
- // 对相关消息进行一些转换
- TranslateMessage(&msg);
- // 将转换后的消息发送给消息过程函数
- DispatchMessage(&msg);
- }
- else
- // 处理向屏幕绘制图像的代码部分
- RenderScene();
- }
- }
- // 释放所有的Direct3D对象
- Shutdown();
- // 注销窗口类
- UnregisterClass("DirectX_GAME", wc.hInstance);
- return 0;
- }
复制代码 |
|