之前本来就有这样的打算的,学了一点HGE引擎之后,再回过头来看DX的SDK,会容易一些。
就像我之前,做过一个MFC的课程设计之后,现在回过头来学孙鑫的第一集WIN32SDK会更容易理解。
这样做的好处就是:在你看不懂的时候仍然能做出东西来,让你不灰心,有兴趣学下去。
如果我开始就看DX的话难度肯定比现在大。而我现在虽然不懂DX,但是也有过开发几个小游戏项目的经验了,而且HGE本身就是基于DX8的这么一个引擎,很大程度上还是保留了一些DX的习惯,所以我现在觉得简单多了。
其实不止是C++,PHP我也是现在直接用ThinkPHP,ASP我用的是EasyAsp,弄来弄去都是框架之类的东西,KISS原则。
好了,闲话不多说,上程序。
这个程序能实现的功能是——————————好吧,不是hello world,而只是一个黑屏。将屏幕以DX的方式渲染成黑色。
- #include <windows.h>
- #include <d3d9.h>
- #pragma comment (lib, "d3d9.lib")
- #pragma comment (lib, "d3dx9.lib")
- #define WS_MYWINDOW (WS_OVERLAPPEDWINDOW &/
- ~WS_MAXIMIZEBOX &/
- ~WS_THICKFRAME)
- /** DirectX对象和装置 */
- LPDIRECT3D9 g_D3D = NULL;
- LPDIRECT3DDEVICE9 g_D3DDevice = NULL;
- /**
- * @brief 关闭函数
- * 退出程序时释放D3D相关资源
- */
- void Shutdown()
- {
- if(NULL != g_D3DDevice) g_D3DDevice->Release();
- if(NULL != g_D3D) g_D3D->Release();
- g_D3DDevice = NULL;
- g_D3D = NULL;
- }
- /**
- * @brief 渲染函数
- * 将屏幕渲染成黑色
- */
- 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);
- }
- /** 初始化D3D */
- bool InitializeD3D(HWND hWnd, bool fullscreen)
- {
- D3DDISPLAYMODE displayMode;
- /** 创建D3D对象 */
- g_D3D = Direct3DCreate9(D3D_SDK_VERSION);
- if(!g_D3D) return false;
- /** 显示模式 */
- if(FAILED(g_D3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &displayMode)))
- return false;
- D3DPRESENT_PARAMETERS d3dpp;
- ZeroMemory(&d3dpp, sizeof(d3dpp));
- if(fullscreen)
- {
- d3dpp.Windowed = false;
- d3dpp.BackBufferWidth = 800;
- d3dpp.BackBufferHeight = 600;
- }
- else
- {
- d3dpp.Windowed = true;
- }
- d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
- d3dpp.BackBufferFormat = displayMode.Format;
- /** 创建装置 */
- if(FAILED(g_D3D->CreateDevice(D3DADAPTER_DEFAULT,
- D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
- &d3dpp, &g_D3DDevice))) return false;
- return true;
- }
- LRESULT WINAPI WinProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
- {
- switch(Msg)
- {
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- break;
- case WM_KEYUP:
- if(VK_ESCAPE == wParam) PostQuitMessage(0);
- break;
- }
- return DefWindowProc(hWnd, Msg, wParam, lParam);
- }
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR, int)
- {
- WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0, 0, hInstance,
- NULL, NULL, NULL, NULL, "App", NULL};
- RegisterClassEx(&wc);
- HWND hWnd;
- hWnd = CreateWindow("App", "DirectX 1.4", WS_MYWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT, 800, 600, NULL, NULL,
- hInstance, NULL);
- if(InitializeD3D(hWnd, false))
- {
- 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();
- }
- }
- Shutdown();
- }
- UnregisterClass("App", wc.hInstance);
- return 0;
- }