Windows 2d遊戲開發

小樹XD發表於2017-11-10
下面的程式碼是GDI遊戲開發的核心框架,我也是按書上碼下來,記錄下來作為參考
//--------------------------程式說明-----------------------------
//程式名稱:GDIdemo
//描述:GDI繪圖模版
//---------------------------------------------------------------
//------------------------標頭檔案部分------------------------------
#include<Windows.h>
//可以在此區域繼續新增標頭檔案
//--------------------------------------------------------------------
//------------------------巨集定義-------------------------------------
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_TITLE L"GDI程式框架"
//-------------------------------------------------------------------
//----------------------全域性變數宣告部分-----------------------------
HDC g_hdc = NULL;//全域性裝置環境控制程式碼
//----------------全域性函式宣告部分---------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);//視窗過程函式
BOOL Game_Init(HWND hwnd);//在此函式進行資源初始化
VOID Game_Paint(HWND hwnd);//在此函式進行繪圖程式碼的書寫
BOOL Game_CleanUp(HWND hwnd);//在此函式進行資源的清理


//--------------------WinMain---------------------------------------
//Windows應用程式的入口函式
//---------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	//[1]視窗建立四部曲之一:開始設計一個完整的視窗類
	WNDCLASSEX  wc = {};//用WNDCLASSEX定義了一個視窗類
	wc.cbSize = sizeof(WNDCLASSEX);//設定結構體的位元組數大小
	wc.style = CS_HREDRAW | CS_VREDRAW;//設定視窗的樣式
	wc.lpfnWndProc = WndProc;//設定指向視窗過程的指標
	wc.cbClsExtra = 0;//視窗類的附加記憶體
	wc.cbWndExtra = 0;//視窗的附加記憶體
	wc.hInstance = hInstance;//制定包含視窗過程的程式的例項控制程式碼
	wc.hIcon = (HICON)::LoadImage(NULL, L"", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);//本地載入自定義圖示“”
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);//指定視窗類的游標控制程式碼
	wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);//指定一個灰色畫刷控制程式碼
	wc.lpszClassName = L"WINDOW";//用一個空終止的字串,指定視窗類的名字
	wc.lpszMenuName = NULL;//用一個空終止的字串,指定選單資源的名字

	//[2]視窗的建立四部曲之二:註冊視窗類
	if (!RegisterClassEx(&wc))//設計完視窗,需要對視窗類進行註冊,這樣才能建立該型別的視窗
		return -1;
	//[3]視窗建立四部曲之三:正式建立視窗
	HWND hwnd = CreateWindow(L"WINDOW", WINDOW_TITLE, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
	//視窗建立四部曲之四:視窗的移動,顯示與更新
	MoveWindow(hwnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);//調整視窗顯示時的位置位於(250,80)處
	ShowWindow(hwnd, nShowCmd);//呼叫showwindow來顯示視窗
	UpdateWindow(hwnd);//隊視窗進行更新
	//遊戲資源的初始化,若初始化失敗彈出一個訊息框並返回FALSE
	if (!Game_Init(hwnd))
	{
		MessageBox(hwnd, L"初始化資源失敗", L"訊息視窗", 0);//使用MESSASGEBOX建立一個訊息視窗
		return FALSE;
	}
	//【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"WINDOW", wc.hInstance);//程式準備結束登出視窗類
	return 0;
}
//-----------------------------WinProc函式-----------------------------------------
//對視窗訊息進行處理
//---------------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	PAINTSTRUCT paintStruct;//定義一個paintstruct來記錄繪製資訊

	switch (message)//switch程式開始
	{
	case WM_PAINT://若是客戶區重繪訊息
		g_hdc = BeginPaint(hwnd, &paintStruct);//指定視窗進行繪圖工作的準備,並將和繪圖有關的資訊填充到painstruct結構體中去
		Game_Paint(hwnd);
		EndPaint(hwnd,&paintStruct);//指定視窗的繪畫過程結束
		ValidateRect(hwnd, NULL);//更新客戶區的顯示
		break;

	case WM_KEYDOWN://鍵盤按下訊息
		if (wParam==VK_ESCAPE)//如果按下esc
			DestroyWindow(hwnd);//銷燬視窗併傳送wm-destroy訊息
		break;
	case WM_DESTROY://若是視窗銷燬資訊
		Game_CleanUp(hwnd);
		PostQuitMessage(0);//向系統表明有個執行緒有終止請求。用來響應WM_DESTROY訊息
		break;//跳出該switch語句

	default://若上述case條件都不符合,則執行default語句
		return DefWindowProc(hwnd, message, wParam, lParam);//呼叫預設的視窗過程
	}
	return 0;//正常退出
}
//-------------------------【Game_Init】
BOOL Game_Init(HWND hwnd)
{
	g_hdc = GetDC(hwnd);
	Game_Paint(hwnd);
	ReleaseDC(hwnd, g_hdc);
	return TRUE;
}
//-------------------------【Game_Paint】
VOID Game_Paint(HWND hwnd)
{


}
//-----------------------------[Game_CleanUp]
BOOL Game_CleanUp(HWND hwnd)
{
	return TRUE;
}

相關文章