標籤:
稍微接觸一下Windows遊戲編程基礎,雖然不大喜歡遊戲,但是為了擴大知識面,為以後的創新與啟發打下基礎,還是稍微瞭解一下:
先來看一個執行個體吧:
這是程式的檔案目錄:
裡麵包含背景音樂與背景映像模板
程式運行效果如下,當然在這裡是聽不到背景音樂啦,只有你動手親自去實踐,才能懂得編程的樂趣。
主要代碼如下:
//-----------------------------------【程式說明】----------------------------------------------// 描述:透明貼圖兩套體系之:透明遮罩法 樣本程式//------------------------------------------------------------------------------------------------//-----------------------------------【標頭檔包含部分】---------------------------------------// 描述:包含程式所依賴的標頭檔//------------------------------------------------------------------------------------------------#include <windows.h>//-----------------------------------【庫檔案包含部分】---------------------------------------// 描述:包含程式所依賴的庫檔案//------------------------------------------------------------------------------------------------#pragma comment(lib,"winmm.lib") //調用PlaySound函數所需庫檔案//-----------------------------------【宏定義部分】--------------------------------------------// 描述:定義一些輔助宏//------------------------------------------------------------------------------------------------#define WINDOW_WIDTH 932 //為視窗寬度定義的宏,以方便在此處修改視窗寬度#define WINDOW_HEIGHT 700 //為視窗高度定義的宏,以方便在此處修改視窗高度#define WINDOW_TITLE L"【致我們永不熄滅的遊戲開發夢想】透明貼圖兩套體系之:透明遮罩法" //為視窗標題定義的宏//-----------------------------------【全域變數聲明部分】-------------------------------------// 描述:全域變數的聲明//------------------------------------------------------------------------------------------------HDC g_hdc=NULL,g_mdc=NULL; //全域裝置環境控制代碼與全域記憶體DC控制代碼HBITMAP g_hBackGround,g_hCharacter1,g_hCharacter2; //定義3個位元影像控制代碼,用於3張圖片的存放//-----------------------------------【全域函式宣告部分】-------------------------------------// 描述:全域函式宣告,防止“未聲明的標識”系列錯誤//------------------------------------------------------------------------------------------------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 wndClass = { 0 }; //用WINDCLASSEX定義了一個視窗類別 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(WHITE_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,200,20,WINDOW_WIDTH,WINDOW_HEIGHT,true); //調整視窗顯示時的位置,使視窗左上方位於(200,20)處 ShowWindow( hwnd, nShowCmd ); //調用ShowWindow函數來顯示視窗 UpdateWindow(hwnd); //對視窗進行更新,就像我們買了新房子要裝修一樣 //遊戲資源的初始化,若初始化失敗,彈出一個訊息框,並返回FALSE if (!Game_Init (hwnd)) { MessageBox(hwnd, L"資源初始化失敗", L"訊息視窗", 0); //使用MessageBox函數,建立一個訊息視窗 return FALSE; } PlaySound(L"寶瓶時代1.wav", NULL, SND_FILENAME | SND_ASYNC|SND_LOOP); //迴圈播放背景音樂 //【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 ) { PAINTSTRUCT paintStruct; //定義一個PAINTSTRUCT結構體來記錄一些繪製資訊 switch( message ) //switch語句開始 { case WM_PAINT: // 若是客戶區重繪訊息 g_hdc = BeginPaint( hwnd, &paintStruct ); //指定視窗進行繪圖工作的準備,並用將和繪圖有關的資訊填充到paintStruct結構體中。 Game_Paint( hwnd); EndPaint( hwnd, &paintStruct ); //EndPaint函數標記指定視窗的繪畫過程結束 ValidateRect(hwnd, NULL); // 更新客戶區的顯示 break; //跳出該switch語句 case WM_KEYDOWN: // 若是鍵盤按下訊息 if (wParam == VK_ESCAPE) // 如果被按下的鍵是ESC DestroyWindow(hwnd); // 銷毀視窗, 並發送一條WM_DESTROY訊息 break; //跳出該switch語句 case WM_DESTROY: //若是視窗銷毀訊息 Game_CleanUp(hwnd); //調用自訂的資源清理函數Game_CleanUp()進行退出前的資源清理 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); //擷取裝置環境控制代碼 //-----【位元影像繪製四步曲之一:載入位元影像】----- //從檔案載入3張位元影像 g_hBackGround = (HBITMAP)LoadImage(NULL,L"bg.bmp",IMAGE_BITMAP,WINDOW_WIDTH,WINDOW_HEIGHT,LR_LOADFROMFILE); g_hCharacter1 = (HBITMAP)LoadImage(NULL,L"character1.bmp",IMAGE_BITMAP,640,579,LR_LOADFROMFILE); g_hCharacter2 = (HBITMAP)LoadImage(NULL,L"character2.bmp",IMAGE_BITMAP,800,584,LR_LOADFROMFILE); //-----【位元影像繪製四步曲之二:建立相容DC】----- g_mdc = CreateCompatibleDC(g_hdc); //建立相容裝置環境的記憶體DC Game_Paint(hwnd); ReleaseDC(hwnd,g_hdc); //釋放裝置環境 return TRUE;}//-----------------------------------【Game_Paint( )函數】--------------------------------------// 描述:繪製函數,在此函數中進行繪製操作//--------------------------------------------------------------------------------------------------VOID Game_Paint( HWND hwnd ){ //先貼上背景圖 SelectObject(g_mdc,g_hBackGround); BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY); //採用BitBlt函數在g_hdc中先貼上背景圖 //用透明遮罩法繪製出第一個人物 SelectObject(g_mdc,g_hCharacter1); BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,320,0,SRCAND);//透明遮罩法第一步,即將屏蔽圖與背景圖做"AND"運算 BitBlt(g_hdc,50,WINDOW_HEIGHT-579,320,640,g_mdc,0,0,SRCPAINT);//透明遮罩法第二步,即將前景圖與背景圖做"OR"運算 //用透明遮罩法繪製出第二個人物 SelectObject(g_mdc,g_hCharacter2); BitBlt(g_hdc,450,WINDOW_HEIGHT-584,400,584,g_mdc,400,0,SRCAND);//透明遮罩法第一步,即將屏蔽圖與背景圖做"AND"運算 BitBlt(g_hdc,450,WINDOW_HEIGHT-584,400,584,g_mdc,0,0,SRCPAINT);//透明遮罩法第二步,即將前景圖與背景圖做"OR"運算}//-----------------------------------【Game_CleanUp( )函數】--------------------------------// 描述:資源清理函數,在此函數中進行程式退出前資源的清理工作//---------------------------------------------------------------------------------------------------BOOL Game_CleanUp( HWND hwnd ){ //釋放資來源物件 DeleteObject(g_hBackGround); DeleteObject(g_hCharacter2); DeleteObject(g_hCharacter1); DeleteDC(g_mdc); return TRUE;}
Windows機制下的遊戲編程執行個體一