上一次我們建立起了SDL環境,接下來,我們談一談什么是SDL?如何起動和退出SDL.
Simple DirectMedia Layer庫,簡稱SDL,它是一個跨平台的多媒體庫,以用於直接控制底層的多媒體硬件的接口。這些多媒體功能包括了視頻、音頻、鍵盤和鼠標(事件)、游戲搖桿等。當然,最為重要的是提供了2D圖形幀緩沖(framebuffer)的接口,以及為OpenGL與各種操作系統之間提供了統一的標准接口以實現3D圖形。也就是說我們通過這個圖形庫可以自己寫游戲,播放電影、歌曲等等,哪些C語言基本庫里無法完成的任務,我們可以通過SDL的庫完成,只要按上一次的要求安裝完了SDL,我們就可以自由的使用SDL完成自己想要完成的功能!
SDL是一個跨平台的庫,它支持: Windows, Windows CE,Linux, BeOS, MacOS, Mac OS X, FreeBSD, NetBSD, OpenBSD, BSD/OS, Solaris, IRIX,QNX
SDL是用C語言開發的,但它對C++支持的更好!所以你在網上可以找到很多SDL源代碼都是C++寫的。除了這兩種語言,SDL還支持:Java,C#, D,PHP,Eiffel, Erlang, Python,Euphoria, Ada, Go,Guile, Haskell, Lisp, Lua, ML, Objective C, Pascal, Perl, Pike, Pliant, Ruby, Smalltalk, and Tcl.幾乎支持所有當下流行的語言!
為什么選擇SDL做圖形庫而不是DirectX、OpenGl等著名的圖形庫呢?第一,SDl是免費的,它能夠完成絕大多數哪些大的圖形庫的功能,但你可以隨意使用不需要付費,而且它是跨平台的,可以在多種平台上使用。第二,SDL小巧精悍,接口簡單,向用戶隱蔽了復雜的操作,用戶只需要懂一點C語言的基礎知識就可以調用它完成很炫的功能。換句話說SDL使你的編程工作變得簡單容易,而完成同樣的功能DirectX代碼量最少是SDL的5到6倍!那么你現在是不是覺得對於一個編程新手來說,SDL是最佳選擇!
本系列教程是寫給C編程的入門者或對C語言情有獨鍾者!所有代碼均用C語言實現,用C語言也可以實現很酷的功能!
下面我們看一下如何調用SDL的庫函數完成相應的功能,還以上次安裝教程里的代碼為例。
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <SDL\SDL.h> 4 5 SDL_Surface *gpScreen; 6 7 int main(int argc,char *argv[]) 8 { 9 if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { 10 exit(-1); 11 } 12 13 gpScreen = SDL_SetVideoMode(600,600, 0, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF ); 14 if( NULL == gpScreen ) { 15 SDL_Quit(); 16 return -1; 17 } 18 19 SDL_Delay(3000); 20 SDL_FreeSurface(gpScreen);//退出程序前必須釋放 21 SDL_Quit();//關閉SDL各個子系統 22 23 system("pause"); 24 return 0; 25 }
首先要使用SDL必須加載SDL.h頭文件,再者主函數的寫法必須是int main(int argc,char *argv[]),不能是int main(void),否則會報編譯錯誤。
要使用SDL,必須先初始化SDL,函數int SDL_Init(Uint32 flags),參數flags是一個無符號整數,表示要初始化SDL哪些子系統。
| 名稱 | 常量 | 值 | 說明 | 自動初始化 |
| 定時器 |
SDL_INIT_TIMER | 0x00000001 | 初始化時間子系統 | 否 |
| 音頻 |
SDL_INIT_AUDIO | 0x00000010 | 初始化音頻子系統 | 否 |
| 視頻 |
SDL_INIT_VIDEO | 0x00000020 | 初始化視頻子系統 | 否 |
| CDROM |
SDL_INIT_CDROM | 0x00000100 | 初始化CDROM子系統 | 否 |
| 游戲桿 |
SDL_INIT_JOYSTICK | 0x00000200 | 初始化JOYSTICK子系統 | 否 |
| 錯誤捕獲 |
SDL_INIT_NOPARACHUTE | 0x00100000 | 避免捕獲致命錯誤 | 是 |
| 線程 |
SDL_INIT_EVENTTHREAD | 0x01000000 | 初始化線程子系統 | 是 |
| 全部子系統 |
SDL_INIT_EVERYTHING | 0x0000FFFF | 初始化上述所有子系統 | 否 |
SDL_Init()函數初始化成功返回0。如果初始化失敗,函數返回值為-1。函數只接受各個子系統的常量作為參數。如果要初始化視頻屏幕,傳入常數SDL_INIT_VIDEO作為參數;初始化音頻,傳入常數SDL_INIT_AUDIO;如果同時初始化視頻和音頻,傳入SDL_INIT_VIDEO|SDL_INIT_AUDIO。如果同時傳入多個量要使用|將它們隔開:
1 if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 ) 2 { 3 printf(“Unable to init SDL: %s\n”, SDL_GetError()); 4 return 1; 5 }
初始化失敗,要直接退出程序,不能使用SDL了,其中SDL_GetError函數是返回SDL的錯誤,其原型是:char *SDL_GetError(void);其返回值是一個字符串。
初始化完成后,你就可以使用相應SDL子系統完成相應的任務了,當你完成所有工作需要退出程序時,必須關閉相應SDL子系統並做相關清理工作,完成這項工作可以調用void SDL_Quit(void);函數完成關閉SDL。一般可以這樣寫:
.... //初始化SDL SDL_InitSDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); //添加自己的處理代碼 ..... SDL_Quit(); ......
記住退出程序之前必須調用這個函數關閉SDL,如果你的代碼里有多個地方寫exit函數結束程序或return 0結束程序則必須在這些語句前調用SDL_Quit()函數。一般這種情況我們使用另外一個函數來關閉SDL:atexit(SDL_Quit); atexit(void (__cdecl *func )( void ))是C語言標准庫里的函數,從函數名atexit可以看出這個函數是在結束程序的時候調用,所以我們可以調用這個函數來關閉SDL,atexit()函數的參數是一個函數的名字,意思是在程序結束前調用指定函數做一些善后處理工作。atexit()函數的作用是向系統注冊傳進來的函數,以便程序結束時調用該函數。這個函數可以在微軟的MSDN中查到。
.... //初始化SDL SDL_InitSDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); atexit(SDL_Quit);
//添加自己的處理代碼 ...........
這樣寫,無論你在哪里結束程序,系統都會執行SDL_Quit()函數關閉SDL。和初始化結束相關的函數還有:
| 函數名 | 功能 |
| SDL_Init | 初始化SDL一個或多個子系統 |
| SDL_InitSubSystem | 在調用SDL_Init初始化SDL后,你可以調用該函數初始化其他子系統,用法和SDL_Init相同,但必須在SDL_Init調用后調用 |
| SDL_Quit | 關閉所有SDL子系統,清理SDL所占資源。 |
| SDL_QuitSubSystem | 在初始化后如果你想關閉某個子系統而不想關閉所有SDL子系統則可以調用該函數。 |
| SDL_WasInit | 檢查指定子系統是否被初始化,返回值是該子系統的常量值(見表2.1) |
| SDL_GetError | 返回最后一次SDL的錯誤,返回值是一個字符串。 |
本次討論了SDL起動和結束需要注意的地方。大家應該掌握SDL初始化過程和退出SDL時應該怎樣處理。
下一次我們將一起看一看SDL中用的最多的子系統視頻子系統。
