程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> SDL起動與退出

SDL起動與退出

編輯:關於C語言

上一次我們建立起了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中用的最多的子系統視頻子系統。


本文出自 “學習之樂” 博客,請務必保留此出處http://chengshaolei.blog.51cto.com/1994169/1291962

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved