SDL起動與退出

上一次我們建立起了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哪些子系統。  

表2.1 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中用的最多的子系統視頻子系統。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章