1. 程式人生 > >SDL的一些基本函式詳解

SDL的一些基本函式詳解

首先,這篇帖子參考了雷神的帖子,具體的可以去雷神那裡去看。

1.初始化函式

int SDLCALL SDL_Init(Uint32 flags);
param:
		SDL_INIT_TIMER:定時器
		SDL_INIT_AUDIO:音訊
		SDL_INIT_VIDEO:視訊
		SDL_INIT_JOYSTICK:搖桿
		SDL_INIT_HAPTIC:觸控式螢幕
		SDL_INIT_GAMECONTROLLER:遊戲控制器
		SDL_INIT_EVENTS:事件
		SDL_INIT_NOPARACHUTE:不捕獲關鍵訊號(這個不理解)
		SDL_INIT_EVERYTHING:包含上述所有選項
return:成功0,失敗非0

2.獲取錯誤碼

Mix_GetError();
param:無引數
return:返回字串形式的錯誤資訊

3.建立一個符合引數的視窗

	SDL_Window * SDLCALL SDL_CreateWindow(const char *title, int x, int y, int w, int h, Uint32 flags);
	param:
		title 視窗標題
		x 視窗左上角x座標
		y 視窗左上角y座標
		w 視窗的寬度
		h 視窗的高度
		flags:
		::SDL_WINDOW_FULLSCREEN,    								    
		::SDL_WINDOW_OPENGL,
		::SDL_WINDOW_HIDDEN,      
		::SDL_WINDOW_BORDERLESS,
		::SDL_WINDOW_RESIZABLE,     
		::SDL_WINDOW_MAXIMIZED,
		::SDL_WINDOW_MINIMIZED, 
		::SDL_WINDOW_INPUT_GRABBED,
		::SDL_WINDOW_ALLOW_HIGHDPI.
		return:視窗控制代碼

4.根據一個傳入的控制代碼建立一個視窗

	SDL_Window * SDL_CreateWindowFrom(const void *data);
parameter: data (HWND)形式的視窗控制代碼
return:建立好的視窗控制代碼

5.建立渲染器

SDL_Renderer * SDL_CreateRenderer(SDL_Window * window,
                                               int index, Uint32 flags);
param:
		window  				建立好的視窗
		index				打算初始化的渲染裝置的索引。設定“-1”則初始化預設的渲染裝置。
		flags				常使用SDL_RENDERER_ACCELERATED 
		SDL_RENDERER_SOFTWARE :使用軟體渲染
		SDL_RENDERER_ACCELERATED :使用硬體加速
		SDL_RENDERER_PRESENTVSYNC:和顯示器的重新整理率同步
		SDL_RENDERER_TARGETTEXTURE :不太懂
		返回建立完成的渲染器的ID。如果建立失敗則返回NULL。
return:建立好的渲染器

6.建立紋理

SDL_Texture * SDLCALL SDL_CreateTexture(SDL_Renderer * renderer,Uint32 format,int access, int w,int h);
params:
	renderer 	建立好的渲染器
	format		紋理的格式,有YUV和RGB的,下面只是其中一部分
			SDL_PIXELFORMAT_YV12
			SDL_PIXELFORMAT_IYUV
			SDL_PIXELFORMAT_YUY2
			SDL_PIXELFORMAT_UYVY
			SDL_PIXELFORMAT_YVYU
			SDL_PIXELFORMAT_NV12
			SDL_PIXELFORMAT_NV21
	access		
		SDL_TEXTUREACCESS_STATIC	:變化極少
		SDL_TEXTUREACCESS_STREAMING	:變化頻繁
		SDL_TEXTUREACCESS_TARGET	:暫時沒有理解
	w		紋理的寬
	h		紋理的高
return 	建立成功則返回紋理的ID,失敗返回0。

7.更新紋理

int SDLCALL SDL_UpdateTexture(SDL_Texture * texture,const SDL_Rect * rect,const void *pixels, int pitch);
param:
		texture:目標紋理。
		rect:更新畫素的矩形區域。設定為NULL的時候更新整個區域。
		pixels:畫素資料。
		pitch:一行畫素資料的位元組數。
return:
		成功的話返回0,失敗的話返回-1。

8.為紋理加鎖,鎖期間只允許寫入

int SDLCALL SDL_LockTexture(SDL_Texture * texture,
                                            const SDL_Rect * rect,
                                            void **pixels, int *pitch);
        param:
        	texture	目標紋理
        	rect		目標矩形
        	pixels	畫素
        	pitch	暫不清楚

9.將紋理複製到渲染器

	int SDLCALL SDL_RenderCopy(SDL_Renderer * renderer,SDL_Texture * texture,const SDL_Rect * srcrect,const SDL_Rect * dstrect);
		renderer:目標渲染器。
	texture:輸入紋理。
	srcrect:選擇輸入紋理的一塊矩形區域作為輸入。設定為NULL的時候整個紋理作為輸入。
	dstrect:選擇渲染目標的一塊矩形區域作為輸出。設定為NULL的時候整個渲染目標作為輸出。
	成功的話返回0,失敗的話返回-1。

10使用渲染器顯示

	void SDLCALL SDL_RenderPresent(SDL_Renderer * renderer);
	renderer:目標渲染器。

11 釋放紋理

void SDL_DestroyTexture( texture );
texture 目標紋理

12.解鎖

void SDLCALL SDL_UnlockTexture(SDL_Texture * texture);
texture 目標紋理

13 延時

SDL_delay() 延時,一秒25幀,防止出現快進,播放速度   每秒延時40

14 刪除渲染器

void SDLCALL SDL_DestroyRenderer(SDL_Renderer * renderer);
renderer: 目標渲染器

15. 釋放視窗

void SDLCALL SDL_DestroyWindow(SDL_Window * window);
window : 目標視窗

16.退出SDL

void SDLCALL SDL_Quit(void);

17.設定紋理混合模式

int SDLCALL SDL_SetTextureBlendMode(SDL_Texture * texture,
                                                    SDL_BlendMode blendMode);
              texture   目標紋理
              blendMode 混合模式
              		SDL_BLENDMODE_NONE
              		SDL_BLENDMODE_BLEND
              		SDL_BLENDMODE_ADD
              		SDL_BLENDMODE_MOD
              		SDL_BLENDMODE_INVALID

18.設定透明度

int SDLCALL SDL_SetTextureAlphaMod(SDL_Texture * texture,
                                                   Uint8 alpha);
           param
           		texture	目標紋理
           		alpha	透明度
           return   0成功,非0失敗

19.開啟聲音裝置

 int SDLCALL SDL_OpenAudio(SDL_AudioSpec * desired,SDL_AudioSpec * obtained);	
 	SDL_AudioSpec引數
	int freq;             取樣率,每秒取樣次數
    SDL_AudioFormat format;    音訊資料格式;format 告訴SDL我們將要給的格式。在“S16SYS”中的S表示有符號的signed,
								16表示每個樣本是16位長的,SYS表示大小頭的順序是與使用的系統相同的。這些格式是
								由avcodec_decode_audio2為我們給出來的輸入音訊的格式。
								AUDIO_U16SYS:Unsigned 16-bit samples
								AUDIO_S16SYS:Signed 16-bit samples
								AUDIO_S32SYS:32-bit integer samples
								AUDIO_F32SYS:32-bit floating point samples

    Uint8 channels;            聲音的通道數 1 單聲道, 2 立體聲;
    Uint8 silence;              表示靜音的值。因為聲音取樣是有符號的,所以0當然就是這個值。
    Uint16 samples;             audio buffer size in samples (power of 2); 詳情參考“討論”
    Uint16 padding;             考慮到相容性的一個引數。
    Uint32 size;                音訊快取區大小(位元組數),當我們想要更多聲音的時候,我們想讓SDL給出來的聲音緩衝區的尺寸。
								一個比較合適的值在512到8192之間;ffplay使用1024。
    SDL_AudioCallback callback; 當音訊裝置需要更多資料時呼叫的回撥函式; 
    void *userdata;             這個是SDL供給回撥函式執行的引數。我們將讓回撥函式得到整個編解碼的上下文資訊;
	
	//回撥格式
	void (SDLCALL * SDL_AudioCallback) (void *userdata, Uint8 * stream,int len);
	userdata:SDL_AudioSpec結構中的使用者自定義資料,一般情況下可以不用。
	stream:該指標指向需要填充的音訊緩衝區。
	len:音訊緩衝區的大小(以位元組為單位)。
		在回撥函式中可以使用SDL_MixAudio()完成混音等工作。眾所周知SDL2和SDL1.x關於視訊方面的API差別很大。
		但是SDL2和SDL1.x關於音訊方面的API是一模一樣的。唯獨在回撥函式中,SDL2有一個地方和SDL1.x不一樣:
		SDL2中必須首先使用SDL_memset()將stream中的資料設定為0。

	desired:期望的引數。
	obtained:實際音訊裝置的引數,一般情況下設定為NULL即可。

20迴圈播放聲音

	void SDLCALL SDL_PauseAudio(int pause_on)
	當pause_on設定為0的時候即可開始播放音訊資料。設定為1的時候,將會播放靜音的值。

21 拿到制定視窗的控制代碼

SDL_Surface * SDLCALL SDL_GetWindowSurface(SDL_Window * window);
param window 目標視窗控制代碼
return 對應視窗的表面

一點心得:紋理(texture)和表面(surface)的區別,紋理是硬體的概念,可以使用GPU,效能較好,而表面是軟體的概念,是在記憶體中的,效能不是很好。