SDL的一些基本函数详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38126105/article/details/85227390

首先,这篇帖子参考了雷神的帖子,具体的可以去雷神那里去看。

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,性能较好,而表面是软件的概念,是在内存中的,性能不是很好。

猜你喜欢

转载自blog.csdn.net/m0_38126105/article/details/85227390
今日推荐