本文來自Dev Hub,一切解釋權歸原作者。我只是出自個人愛好,才翻譯了本文。因爲本人也是個初學者,而且英語水平有限,錯誤難免,望各路高手指正。
本課原文地址:http://www.sdltutorials.com/sdl-image/
本教程相當簡單,簡短,有趣。我將向你介紹如何不再使用那些令人討厭的位圖(BMP)文件,因爲他們太大了也不支持alpha透明,然後開始爲你的那些表面使用其他文件格式(我個人比較喜歡PNG)。如果你還沒讀過我的“SDL 座標和塊複製”這課,還是現在就去看看吧。我們就從那篇教程開始,修改CSurface類的一個OnLoad()函數。
首先,你需要先下載SDL_image,可以從SDL的官網獲取最新版本。你也可以從其中的“Libraries”章節下載這個庫,就在SDL的主頁上。如果你不想爲此麻煩,我提供的SDL包對於大多數SDL初學者都很有幫助,裏面包含了SDL_image和其他一些有用的庫。一定要保證其頭文件和你的SDL頭文件在同一目錄下,還有庫文件也要和你的SDL庫文件路徑一致,這會省去很多麻煩。
先打開你的工程,到連接器設置下。在SDLmain後面添加SDL_image,如下:
mingw32
SDLmain
SDL_image
SDL
如果你忘了怎麼找到這些設置,還是希望你複習一下“SDL課程基礎”來溫習一下連接器這塊。
首先,打開CSurface.h,然後我們就可以包括更多的頭文件了:
#ifndef _CSURFACE_H_
#define _CSURFACE_H_
#include <SDL.h>
#include <SDL_image.h>
完成至此,打開CSurface.cpp,找到OnLoad函數。目前,我們的代碼如下:
SDL_Surface* CSurface::OnLoad(char* File) {
SDL_Surface* Surf_Temp = NULL;
SDL_Surface* Surf_Return = NULL;
if((Surf_Temp = SDL_LoadBMP(File)) == NULL) {
return NULL;
}
Surf_Return = SDL_DisplayFormat(Surf_Temp);
SDL_FreeSurface(Surf_Temp);
return Surf_Return;
}
這裏要做兩點改變,首先是把SDL_LoadBMP改成IMG_Load。其次,把SDL_DisplayFormat改成SDL_DisplayFormatAlpha。還記得我說過BMP文件不支持alpha通道的吧?但是,PNG卻支持!如果你想留住alpha通道,那就需要用SDL_DisplayFormatAlpha來代替SDL_DisplayFormat。如此一來,我們的代碼就成了這個樣子了:
SDL_Surface* CSurface::OnLoad(char* File) {
SDL_Surface* Surf_Temp = NULL;
SDL_Surface* Surf_Return = NULL;
if((Surf_Temp = IMG_Load(File)) == NULL) {
return NULL;
}
Surf_Return = SDL_DisplayFormatAlpha(Surf_Temp);
SDL_FreeSurface(Surf_Temp);
return Surf_Return;
}
最後,別忘了改變CApp_OnInit.cpp裏的測試表面要加載的文件名:
if((Surf_Test = CSurface::OnLoad("myimage.png")) == NULL) {
return false;
}
這樣我們就完成了!我說過的很短的吧。試試編譯下,然後試試不同格式的文件。SDL_image支持的一般格式有:
BMP (Go figure)
GIF
PNG
JPG
PCX
TIF
and others…
請注意下現在需要的和SDL圖像相關的附加DLL文件(大概有5個)。保證這些都包含在你的工程裏了。你可以從此下載這些DLL文件,http://www.libsdl.org/projects/SDL_image/ 在Binary -> Win32 -> 下的Win32 Zip(而不是VC8)(譯註:原作者用的是CB,用微軟VS的要用這個。)。並且這些DLL文件也包含在工程文件下面。
本教程來自Blommis的創意。
SDL圖像 —— 課程文件:
Win32: Zip, Rar
Linux: Tar (Thanks Gaten), Binary (Thanks Thomas)