上一次我們建立起了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.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_VIDEO0x00000020初始化視頻子系統 否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中用的最多的子系統視頻子系統。
本文出自 “學習之樂” 博客,請務必保留此出處http://chengshaolei.blog.51cto.com/1994169/1291962