Lesson 4 按鍵

關閉窗口只是SDL中一種可以處理的事件,其他類型例如遊戲中大量的鍵盤輸入,本教程我們將讓不同的圖像顯示根據你按下的鍵盤:

enum KeyPressedSurfaces{
    KEY_PRESS_SURFACE_DEFAULT,
    KEY_PRESS_SURFACE_UP,
    KEY_PRESS_SURFACE_DOWN,
    KEY_PRESS_SURFACE_LEFT,
    KEY_PRESS_SURFACE_RIGHT,
    KEY_PRESS_SURFACE_TOTAL
};
/*
在代碼的頂部我們聲明瞭一個枚舉來表示不同的窗口表面,枚舉用一種快速的方法來聲明符號常量而不是const int KEY_PRESS_SURFACE_DEFAULT = 0; const int KEY_PRESS_UP = 1;const int KEY_PRESS_SURFACE_DOWN = 2等等。默認是從 0 開始上升計數。這樣就意味着
 KEY_PRESS_SURFACE_DEFAULT = 0,KEY_PRESS_SURFACE_UP = 1,
 KEY_PRESS_SURFACE_DOWN = 2,KEY_PRESS_SURFACE_LEFT = 3,
 KEY_PRESS_SURFACE_RIGHT = 4,KEY_PRESS_SURFACE_TOTAL = 5。 你可以賦值明確的整數值,但是我們這裏不做,谷歌搜索:枚舉如何覆蓋
程序員使用硬編碼而不是符號常量是一種壞習慣。例如:用1來代表主菜單,2代表選項,等等。這樣做適合小型項目。當你處理成千上百行代碼的時候(通常是遊戲開發),用一行代碼像這樣:"if(option == 1)",這樣非常頭疼的代碼,應該用: if(option == MAIN)_MENU)這樣的代碼
*/
//啓動SDL並創建窗口
bool init();
//加載媒體
bool loadMedia();
//釋放媒體資源並關閉SDL
void close();

//加載個人形象
SDL_Surface* loadSurface(string path);
//聲明窗口對象
SDL_Window* gWindow = nullptr;
//聲明聲明對象
SDL_Surface* gScreenSurface = nullptr;
//圖像對應鍵盤按鍵
SDL_Surface* gKeyPressSufrace[KEY_PRESS_SURFACE_TOTAL];
//當前顯示圖像
SDL_Surface* gCurrentSurface = nullptr;
/*
利用通用函數原型,我們聲明一個新的函數 loadSurface,如果你拷貝/粘貼代碼這是一種通用的代碼,防止在複製/粘貼的時候出現錯誤,我們使用一個函數來處理

這個項目最終要的是,我們有一個SDL_Surface數組的指針叫做gKeyPressSurfaces將包含我們所使用的所有圖片,在用戶按下鍵盤,將會顯示這個數組中所包含的一個表面
*/ 
SDL_Surface* loadSurface(string path){
    //加載指定路徑圖像
    SDL_Surface* loadedSurface = SDL_LoadBMP(path.c_str());
    if(loadedSurface == nullptr){
        printf("Unable to load image:%s! SDL_Error:%s\n",path.c_str(), SDL_GetError());
    }
    return loadedSurface;
}
/*
loadSurface 用來加載圖片,如果出現錯誤的話就會報告一個錯誤,差不多和以前一樣,但是這個函數包含了加載圖像和報告錯誤的功能使它可以很容易的加載圖片和調試程序
*/ 
bool loadMedia()
{
    //加載成功標誌
    bool success = true;
    //加載默認外觀
    gKeyPressSufrace[KEY_PRESS_SURFACE_DEFAULT] = loadSurface("04_key_presses/press.bmp");
    if(gKeyPressSufrace[KEY_PRESS_SURFACE_DEFAULT] == nullptr){
        printf("Failed to load default image!\n");
        success == false;
    }

    //加載上表面
    gKeyPressSufrace[KEY_PRESS_SURFACE_UP] = loadSurface("04_key_presses/up.bmp");
    if(gKeyPressSufrace[KEY_PRESS_SURFACE_UP] == nullptr){
        printf("Failed to load up image!\n");
        success = false;
    }

    //加載下表面
    gKeyPressSufrace[KEY_PRESS_SURFACE_DOWN] = loadSurface("04_key_presses/down.bmp");
    if(gKeyPressSufrace[KEY_PRESS_SURFACE_DOWN] == nullptr){
        printf("Failed to load down image!\n");
        success = false;
    }
    //加載左表面
    gKeyPressSufrace[KEY_PRESS_SURFACE_LEFT] = loadSurface("04_key_presses/left.bmp");
    if(gKeyPressSufrace[KEY_PRESS_SURFACE_LEFT] == nullptr){
        printf("Failed to load left image!\n");
        success = false;
    }
    //加載右表面
    gKeyPressSufrace[KEY_PRESS_SURFACE_RIGHT] = loadSurface("04_key_presses/right.bmp");
    if(gKeyPressSufrace[KEY_PRESS_SURFACE_RIGHT] == nullptr){
        printf("Failed to load right image!\n");
        success = false;
    }

    return success;
}
//在loadMdia()函數函數函數中我們添加了所要需要顯示的圖片
int main(){

    //主循環標誌
    bool quit = false;
    //事件處理程序
    SDL_Event e;
    //設置默認當前表面
    gCurrentSurface = gKeyPressSufrace[KEY_PRESS_SURFACE_DEFAULT];
    //初始化SDL並創建窗口
    if(!init()){
        printf("Failed to initialized!\n");
    }
    else{
        //添加媒體文件
        if(!loadMedia()){
            printf("Failed to load media!\n");
        }else{
                //程序運行
                while(!quit){
                    //事件處理隊列
                    while(SDL_PollEvent(&e) != 0){
                        if(e.type == SDL_QUIT){
                            quit = true;
                        }
                        //用戶按下鍵盤
                        else if(e.type == SDL_KEYDOWN){
                            switch(e.key.keysym.sym){
                                case SDLK_UP:
                                    gCurrentSurface = gKeyPressSufrace[KEY_PRESS_SURFACE_UP];
                                    break;
                                case SDLK_DOWN:
                                    gCurrentSurface = gKeyPressSufrace[KEY_PRESS_SURFACE_DOWN];
                                    break;
                                case SDLK_LEFT:
                                    gCurrentSurface = gKeyPressSufrace[KEY_PRESS_SURFACE_LEFT];
                                    break;
                                case SDLK_RIGHT:
                                    gCurrentSurface = gKeyPressSufrace[KEY_PRESS_SURFACE_RIGHT];
                                    break;
                                default:
                                    gCurrentSurface = gKeyPressSufrace[KEY_PRESS_SURFACE_DEFAULT];
                                    break;
                            }
                        }
                    }
                     //應用當前外觀
                    SDL_BlitSurface(gCurrentSurface, NULL, gScreenSurface, NULL);
                    //更新窗口外觀
                    SDL_UpdateWindowSurface(gWindow);
                }
            }
        }
    close();
    return 0;
}
/*
這是我們的事件循環,裏面的SDL事件是一個SDL鍵盤事件,其中包含關鍵事件的信息。這是一個 SDL Keysym其中包含關鍵信息,把包含 SDL Keycode 的鍵按下,設置新的外觀到窗口中
更新新的外觀到窗口上
*/
程序的完整代碼和媒體文件下載地址(這個二維碼是我博客的地址,修改圖片後綴爲 .rar就可以解壓,因爲我不知道csdn在哪上傳文件):下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章