今天起開始學習游戲編程,我看的是一本CSDN博主【淺墨】的書《逐夢旅程:Windows游戲編程之從零開始》
此博客記錄自己在學習中所掌握的代碼:
先看第一篇:啟航·夯實游戲程序之根
本章講的是C++的游戲編程基礎
總篇最后是創建一個窗口的完整代碼:
總的說明了創建一個窗體的具體步驟:創建一個窗體 WinMain函數->窗口創建四部曲->消息循環->窗口類的注銷->窗口過程函數
經過下面的代碼一個窗體幾乎就創建好啦,每行都有清晰注釋
Code:
- //-----------------------------【程序說明】----------------------------------------
- //程序名稱:GameCore
- //2019年1月 Create by Lamica
- //描述:用代碼勾勒出游戲開發所需程序框架
- //--------------------------------------------------------------------------------
- //-----------------------------【頭部包含部分】-------------------------------------
- //描述:包含程序所依賴的頭文件
- //----------------------------------------------------------------------------------
- #include <Windows.h>
- //------------------------------【宏定義部分】----------------------------------------
- //描述:定義一些輔助宏
- //-----------------------------------------------------------------------------------
- #define WINDOW_WIDTH 800 //為窗口寬度定義宏,以方便在此處修改窗口寬度
- #define WINDOW_HEIGHT 600 //為窗口高度定義宏,以方便在此處修改窗口高度
- #define WINDOW_TITLE L"【致我們永不熄滅的游戲開發夢想】程序核心框架" //為窗口標題定義的宏
- //------------------------------【全局函數聲明】-----------------------------------------
- //描述:全局函數聲明,防止“未聲明的標識”系列錯誤
- //-------------------------------------------------------------------------------------
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
- //-------------------------------【WinMain()函數】---------------------------------------
- //描述:Windows應用程序入口函數,我們的程序從這里開始
- //------------------------------------------------------------------------------------
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) {
- //【1】窗口創建四步曲之一:開始設計一個完整的窗口類
- WNDCLASSEX wndClass = { 0 };//用WNDCLASSEX定義了一個窗口類
- wndClass.cbSize = sizeof(WNDCLASSEX);//設置結構體的字節數大小
- wndClass.style = CS_HREDRAW | CS_VREDRAW; //設置窗口樣式
- wndClass.lpfnWndProc = WndProc; //設置指向窗口過程函數的指針
- wndClass.cbClsExtra = 0;//窗口類的附加內存,取0就可以了
- wndClass.cbWndExtra = 0;//窗口的附加內存,依然取0就可以了
- wndClass.hInstance = hInstance;//指定包含窗口過程的程序實例句柄
- wndClass.hIcon = (HICON)::LoadImage(NULL, L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); //本地加載自定義ico圖標
- wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);//指定窗口類的光標句柄
- wndClass.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//為hbrBackground成員指定一個灰色畫刷句柄
- wndClass.lpszMenuName = NULL;//用一個以空終止的字符串,指定菜單資源的名字。
- wndClass.lpszClassName = L"ForTheDreamOfGameDevelop";//用一個以空終止的字符串,指定窗口的名字。
- //【2】窗口創建四步曲之二:注冊窗口類
- if (!RegisterClassEx(&wndClass))//設計完窗口后,需要對窗口類進行注冊,這樣才能創建該類型窗口
- {
- return -1;
- }
- //【3】窗口創建四步曲之三:正式創建窗口
- HWND hwnd = CreateWindow(L"ForTheDreamOfGameDevelop", WINDOW_TITLE,//喜聞樂見的創建窗口函數CreateWindow
- WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
- //【4】窗口創建四步曲之四:窗口的移動,顯示與更新
- MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//調整窗口顯示時的位置,使窗口左上角位於(250,80)處
- ShowWindow(hwnd, nShowCmd);//調用ShowWindow函數來顯示窗口
- UpdateWindow(hwnd);//對窗口進行更新,就像我們買了新房子要裝修一樣
- //【5】消息循環過程
- MSG msg = { 0 }; //定義並初始化msg
- while (msg.message != WM_QUIT) //使用while循環,如果消息不是WM_QUIT消息,就繼續循環
- {
- if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) //查看應用程序消息隊列,有消息時將隊列中消息派發出去
- {
- TranslateMessage(&msg); //將虛擬鍵消息轉換為字符消息
- DispatchMessage(&msg);//分發一個消息給窗口程序
- }
- }
- //【6】窗口類的注銷
- UnregisterClass(L"ForTheDreamOfGameDevelop", wndClass.hInstance); //程序准備結束,注銷窗口類
- return 0;
- }
- //------------------------------------------【WndProc()函數】-------------------------------------
- //描述:窗口過程函數WndProc(回調函數),對窗口消息進行處理
- //-----------------------------------------------------------------------------------------------
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
- switch (message) //switch 語句開始
- {
- case WM_PAINT://若是客戶區重繪消息
- ValidateRect(hwnd, NULL);//更新客戶區的顯示
- break;//跳出該switch語句
- case WM_KEYDOWN://若是鍵盤按下消息
- if (wParam == VK_ESCAPE) //如果被按下的是ESC
- {
- DestroyWindow(hwnd); //銷毀窗口,並發送一條WM_DESTROY消息
- }
- break;//跳出該switch語句
- case WM_DESTROY://若是窗口銷毀消息
- PostQuitMessage(0);//向系統表明有個線程終止請求。用來響應WM_DESTROY消息
- break;//跳出該switch語句
- default://若上述case條件都不符合,則執行該default語句
- return DefWindowProc(hwnd, message, wParam, lParam);//調用默認窗口過程
- }
- return 0;//正常退出
- }
F5執行結果:
這樣一個C++窗體就創建完成了
最后分享淺墨大大的一句話:
我們會覺得焦慮,無非是因為現在的我們跟想像中的自己很有差距。打敗焦慮的最好方法,就是去做那些讓你焦慮的事情,不要問,不要等,不要猶豫,不要回頭,既然你認准了這條路,就不要去打聽要走多久。
對自己的總結:之前自己是寫C#,和VB.NET的,用他們創建一個窗體,只要會托控件就行了,但是在C++這里,感覺自己離底層更近了,windows的消息處理機制,以及窗口的銷毀,創建整個生命周期在C#,與VB.NET中是完全感覺不到了。
為了游戲編程夢加油發。