上一次我們建立起了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的庫函數完成相應的功能,還以上次安裝教程裏的代碼爲例。
#include <stdio.h> #include <stdlib.h> #include <SDL\SDL.h> SDL_Surface *gpScreen; int main(int argc,char *argv[]) { if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) { exit(-1); } gpScreen = SDL_SetVideoMode(600,600, 0, SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF ); if( NULL == gpScreen ) { SDL_Quit(); return -1; } SDL_Delay(3000); SDL_FreeSurface(gpScreen);//退出程序前必須釋放 SDL_Quit();//關閉SDL各個子系統 system("pause"); return 0; }
要使用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。如果同時傳入多個量要使用|將它們隔開:
1if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 )2{3 printf(“Unable to init SDL: %s\n”, SDL_GetError());4return1;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中用的最多的子系統視頻子系統。