Windows機制下的遊戲編程執行個體一

來源:互聯網
上載者:User

標籤:

稍微接觸一下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機制下的遊戲編程執行個體一

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.