SDL的一些基本函式詳解
阿新 • • 發佈:2018-12-24
首先,這篇帖子參考了雷神的帖子,具體的可以去雷神那裡去看。
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,效能較好,而表面是軟體的概念,是在記憶體中的,效能不是很好。