Lesson 5 優化表面加載和拉伸圖像

直到現在我們已經傳送了我們的原始圖像,因爲我們只顯示一個圖像,因此它不重要。當你製作一個遊戲的時候,傳送原始圖像會導致不必要的速度下降。我們將轉換他們到一種速度更高的格式
SDL2 對SDL的表面也有一個新的拉伸功能,它允許你一個圖像縮放到不同的大小,在
這個教程中我們將把一個圖像縮放到他的一半還有拉伸這個圖像到一個完整大小

SDL_Surface* loadSurface(string path){
    //最終優化的圖像
    SDL_Surface* optimizedSurface = nullptr;

    //加載指定路徑圖像
    SDL_Surface* loadedSurface = SDL_LoadBMP(path.c_str());
    if(loadedSurface == nullptr){
        printf("Unable to load the image:%s!,SDL_Error:%s\n",
               path.c_str(), SDL_GetError());
    }
/*
回到我們的圖像加載函數,我們要做一些修改來讓表面圖像進行轉換,頂部的功能差不多,加載圖片就像原來的圖片一樣,但是我們聲明一個圖像指向最後一個優化的圖像
*/
else{
        //convert surface to screen
        optimizedSurface = SDL_ConvertSurface(loadedSurface, gScreenSurface->format,0);
        if(optimizedSurface == nullptr){
            printf("Unable to optimized the image:%s!SDL_Error:%s\n",
                   path.c_str(), SDL_GetError());
        }
        //釋放原先的外觀指針
        SDL_FreeSurface(loadedSurface);
    }
    return optimizedSurface;
}
/*
如果圖像在原來的表面成功,我們優化外觀的加載
當加載位圖的時候,它通常以24位位圖格式加載,因爲大多數是24位的,大多數。如果不是全部,現在默認是不是24位顯示,如果我們以位塊傳輸圖像24位到32位,SDL 按照位塊轉換每一個單位時間
因此我們需要轉換它們到一個相同的格式當加載一個圖像的時候,可以用SDL_ConvertSurface 實現,我們要做的就是轉換合適的格式到屏幕上
需要注意的一點,SDL_ConvertSurface 返回一個原始格式的副本,原來加載的圖像仍然是在內存中,這就意味着我們需要釋放原來的內尋空間,否則內存中就會有兩份拷貝
圖像加載完成後,我們返回一個最後優化的圖像
順便說一下,SDL_ConvertSurface 的最後一個參數應該是0,如果你的編譯器警告的話,你可以在更改最後一個參數的值爲 0
*/
               //應用拉伸的圖像
                SDL_Rect stretchRect;
                stretchRect.x = 0;
                stretchRect.y = 0;
                stretchRect.w = SCREEN_WIDTH;
                stretchRect.h = SCREEN_HEIGHT;
                SDL_BlitScaled(gStretchedSurface, NULL,
                               gScreenSurface, &stretchRect);
/*
SDL2 有一個新的專用函數轉換圖像到一個不同的大小:SDL_BlitScaled,就像傳輸圖像之前,SDL_BlitScaled傳輸源表面到目的表面,它還需要使用SDL_Rect來定義傳送圖片的位置和大小
如果我們想把一個圖像小於屏幕,或者屏幕的大小,你可以改變目的 寬度/高度 大小到 屏幕的 寬度/高度
*/ 
程序的完整代碼和媒體文件下載地址(這個二維碼是我博客的地址,修改圖片後綴爲 .rar就可以解壓,因爲我不知道csdn在哪上傳文件):右鍵另存爲優化後的代碼右鍵另存爲
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章