SDL2
- SDL
- function
- SDL_Init
- SDL_CreateWindow
- SDL_DestroyWindow
- SDL_LoadBMP
- SDL_Surface
- SDL_BlitSurface
- SDL_FreeSurface
- SDL_CreateRenderer
- SDL_DestroyRenderer
- SDL_RenderClear
- SDL_RenderCopy
- SDL_RenderPresent
- SDL_CreateTexture
- SDL_DestroyTexture
- SDL_Delay
- SDL_OpenAudio
- SDL_CloseAudio
- SDL_PauseAudio
- SDL_MixAudio
- SDL_Quit
- SDL_Log
- SDL_GetError
- SDL_GL_SetAttribute
- SDL_GetWindowSurface
- SDL_SetRenderDrawColor
- SDL_CreateThread
- SDL_WaitThread
- SDL_CreateMutex
- SDL_DestroyMutex
- SDL_LockMutex
- SDL_UnlockMutex
- Event
- Draw
- example
- function
SDL
function
SDL_Init
int SDL_Init(Uint32 flags);
调用这个函数能初始化SDL的所有子系统,然后我们可以开始使用SDL的图形函数。
flags | 说明 |
---|---|
SDL_INIT_TIMER | timer subsystem (定时器) |
SDL_INIT_AUDIO | audio subsystem (音频) |
SDL_INIT_VIDEO | video subsystem; automatically initializes the events subsystem (视频) |
SDL_INIT_JOYSTICK | 摇杆 |
SDL_INIT_HAPTIC | 触摸屏 |
SDL_INIT_GAMWCONTROLLER | 游戏控制器 |
SDL_INIT_EVENTS | events subsystem (事件) |
SDL_INIT_NOPARACHUTE | 不捕获关键信号 |
SDL_INIT_EVERYTHING | all of the above subsystems (包含上述所有选项) |
返回值:0 成功,非0失败。
SDL_CreateWindow
//设置窗口
SDL_Window *screen = SDL_CreateWindow(const char* title,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640, 480,
SDL_WINDOW_FULLSCREEN | SDL_WINDOW_OPENGL);
用来建立一个640像素宽、480像素高的32位(位/像素)窗口.
此函数替换了老旧的SDL_SetVideoMode允许你创建多个窗口。
-
title:窗口标题
-
x,y窗口坐标
-
w,h窗口大小
-
flags
flags 说明 SDL_WINDOW_FULLSCREEN fullscreen window SDL_WINDOW_FULLSCREEN_DESKTOP fullscreen window at the current desktop resolution SDL_WINDOW_OPENGL window usable with OpenGL context SDL_WINDOW_HIDDEN window is not visible SDL_WINDOW_BORDERLESS no window decoration SDL_WINDOW_RESIZABLE window can be resized SDL_WINDOW_MINIMIZED window is minimized SDL_WINDOW_MAXIMIZED window is maximized SDL_WINDOW_SHOWN show window
SDL_DestroyWindow
SDL_DestroyWindow(SDL_Window* window)
销毁窗口。
SDL_LoadBMP
//加载图像
hello = SDL_LoadBMP( "hello.bmp" );
来加载图片。这个函数需要一个指向位图文件的路径作为参数,并返回一个指向加载好的表面的指针。如果在加载过程中发生了错误,这个函数会返回NULL
。
SDL_Surface
SDL_BlitSurface
//将图像应用到窗口上
SDL_BlitSurface( hello, NULL, screen, NULL );
把加载好的图像应用到窗口上。其中第一个参数是源表面,第三个参数是目的表面,它的功能是将源表面粘贴到目的表面上。 在这个程序里,它是将加载好的图像应用到窗口上。
SDL_FreeSurface
//释放已加载的图像
SDL_FreeSurface( hello );
从内存中移除。你不能仅仅使用delete
,你必须使用SDL_FreeSurface()
来从内存中移除图像。
SDL_CreateRenderer
SDL_Renderer* SDL_CreateRenderer(SDL_Window* window, int index, Uint32 flags);
创建渲染上下文。
-
window:指明在那个窗口里进行渲染
-
index:指定渲染驱动的索引号,一般指定为-1
-
flags:
flags 说明 SDL_RENDERER_SOFTWARE the renderer is a software fallback SDL_RENDERER_ACCELERATED the renderer uses hardware acceleration SDL_RENDERER_PRESENTVSYNC present is synchronized with the refresh rate SDL_RENDERER_TARGETTEXTURE the renderer supports rendering to texture
SDL_DestroyRenderer
void SDL_DestroyRenderer(SDL_Renderer* renderer)
消毁渲染上下文释放渲染上下文相关的资源。
SDL_RenderClear
int SDL_RenderClear(SDL_Renderer* renderer)
清空渲染目标,该函数的作用是用指定的颜色清空缓冲区
- renderer :上面创建的渲染上下文。
SDL_RenderCopy
int SDL_RenderCopy(SDL_Renderer* renderer,
SDL_Texture* texture,
const SDL_Rect* srcrect,
const SDL_Rect* dstrect)
-
srcrect: 指定 Texture 中要渲染的一部分。如果将 Texture全部输出,可以设置它为 NULL。
-
dstrect: 指定输出的空间大小。
SDL_RenderPresent
void SDL_RenderPresent(SDL_Renderer* renderer)
提交渲染,将缓冲区中的内容输出到目标上,也就是 windows 窗口上。
- renderer:上面创建的渲染上下文
SDL_CreateTexture
SDL_Texture* SDL_CreateTexture(SDL_Renderer* renderer,
Uint32 format,
int access,
int w,
int h)
- format:指明像素格式,可以是YUV,也可以是RGB
- access:指明Texture的类型,可以是Stream(视频流),也可以是Target一般的类型
SDL_Texture 与SDL_Surface相似,也是一种缓冲区。只不过它存放的不是真正的像素数据,而是存放的图像的描述信息。这些描述信息通过OpenGL、D3D 或 Metal等技术操作GPU,从而绘制出与SDL_Surface一样的图形,且效率更高(因为它是GPU硬件计算的)。
SDL_DestroyTexture
void SDL_DestroyTexture(SDL_Texture* texture)
销毁Texture。
SDL_Delay
SDL_Delay(2000);
让窗口停留一会儿。这里,我们让窗口延时2000毫秒(即2秒)。
SDL_OpenAudio
int SDL_OpenAudio(SDL_AudioSpec* desired,SDL_AudioSpec* obtained)
打开音频设备
- desired: 设置音频参数。
参数 | 说明 |
---|---|
freq | 每秒采频率 |
SDL_AudioFormat | 音频数据存储格式 |
channels | 通道数 |
silence | 静音值 |
samples | 采样个数 |
size | 音频缓冲区大小 |
SDL_AudioCallback | 回调函数 |
userdata | 回调函数参数指针 |
- obtained: 返回参数。
SDL_CloseAudio
void SDL_CloseAudio(void)
关闭音频设备
SDL_PauseAudio
void SDL_PauseAudio(int pause_on)
pause_on:0暂停播放,1播放.
SDL_MixAudio
void SDL_MixAudio(Uint8* dst,
const Uint8* src,
Uint32 len,
int volume)
- dst: 目的缓冲区
- src: 源缓冲区
- len: 音频数据长度
- volume: 音量大小,0-128 之间的数。SDL_MIX_MAXVOLUME代表最大音量。
SDL_Quit
SDL_Quit(void)
退出关闭SDL,将会删除窗口表面。
SDL_Log
void SDL_Log(const char* fmt,...)
它与C语言中的printf格式相同。
SDL_GetError
SDL_GetError()
SDL_GL_SetAttribute
设置openGL相关属性
SDL_GetWindowSurface
创建surface
SDL_SetRenderDrawColor
int SDL_SetRenderDrawColor(SDL_Renderer* renderer,Uint8 r,Uint8 g,Uint8 b,Uint8 a)
设置颜色,该函数中的参数a指明了颜色的透明度。
SDL_CreateThread
SDL_Thread* SDL_CreateThread(SDL_ThreadFunction fn,const char* name,void* data)
- fn:线程要运行的函数
- name:线程名
- data:函数参数
SDL_WaitThread
void SDL_WaitThread(SDL_Thread* thread,int* status)
等待线程结束。
SDL_CreateMutex
SDL_mutex* SDL_CreateMutex(void)
创建互斥量
SDL_DestroyMutex
void SDL_DestroyMutex(SDL_mutex* mutex)
销毁互斥量。
SDL_LockMutex
void SDL_LockMutex(SDL_mutex* mutex)
加锁
SDL_UnlockMutex
int SDL_UnlockMutex(SDL_mutex* mutex)
解锁
Event
SDL提供几个简单的API:
-
SDL_WindowEvent : Window窗口相关的事件。
-
SDL_KeyboardEvent : 键盘相关的事件。
-
SDL_MouseMotionEvent : 鼠标移动相关的事件。
-
SDL_QuitEvent : 退出事件。
-
SDL_UserEvent : 用户自定义事件。
SDL_PollEvent
将队列头中的事件抛出来。
SDL_WaitEvent
当队列中有事件时,抛出事件,否则处于阻塞状态,释放cpu。
SDL_WaitEventTimeout
与SDL_WaitEvent的区别就是当到达超时时间后,退出阻塞状态。
SDL_PeekEvent
从队列中取出事件,但该事件不从队列中删除。
SDL_PushEvent
向队列中插入事件。
Draw
SDL_RenderDrawPoint
int SDL_RenderDrawPoint(SDL_Renderer* renderer,int x,int y)
画点
SDL_RenderDrawPoints
int SDL_RenderDrawPoints(SDL_Renderer* enderer,const SDL_Point* points,int count)
- points:点数组
- conunt:点的个数
SDL_RenderDrawLine
int SDL_RenderDrawLine(SDL_Renderer* renderer,
int x1,
int y1,
int x2,
int y2)
画线
SDL_RenderDrawLines
int SDL_RenderDrawLines(SDL_Renderer* renderer,const SDL_Point* points,int count)
该函数会将使用两个相邻的点之间进行连线。最终画出你想画的图形。如画三角形,多边形或圆形。
SDL_RenderDrawRect
int SDL_RenderDrawRect(SDL_Renderer* renderer,const SDL_Rect* rect)
- rect:要绘制的一块区域,它包括x,y,w,h这几个元素。
SDL_RenderFillRect
int SDL_RenderFillRect(SDL_Renderer* renderer,const SDL_Rect* rect)
使用指定的颜色填充矩形。
SDL_RenderFillRects
int SDL_RenderFillRects(SDL_Renderer* renderer,const SDL_Rect* rects,int count)
- rects:指定的矩形数组
- count:指定矩形个数
example
audio
音频例子:
#include <stdio.h>
#include <SDL.h>
#define BLOCK_SIZE 4096000
static Uint8 *audio_buf = NULL;
static Uint8 *audio_pos = NULL;
static size_t buffer_len = 0;
//callback function for audio devcie
void read_audio_data(void *udata, Uint8 *stream, int len){
if(buffer_len == 0){
return;
}
SDL_memset(stream, 0, len);
len = (len < buffer_len) ? len : buffer_len;
SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
audio_pos += len;
buffer_len -= len;
}
int main(int argc, char *argv[])
{
int ret = -1;
FILE *audio_fd = NULL;
SDL_AudioSpec spec;
char *path = "./test.pcm";
//SDL initialize
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)){
fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
return ret;
}
//open pcm file
audio_fd = fopen(path, "r");
if(!audio_fd){
fprintf(stderr, "Failed to open pcm file!\n");
goto __FAIL;
}
//SDL_AudioSpec
spec.freq = 44100;;
spec.format = AUDIO_S16SYS;
spec.channels = 2;
spec.silence = 0;
spec.samples = 1024;;
spec.callback = read_audio_data;;
spec.userdata = NULL;
//open audio devcie
if(SDL_OpenAudio(&spec, NULL)){
fprintf(stderr, "Failed to open audio device, %s\n", SDL_GetError());
goto __FAIL;
}
//play audio
SDL_PauseAudio(0);
do{
//read data from pcm file
buffer_len = fread(audio_buf, 1, BLOCK_SIZE, audio_fd);
fprintf(stderr, "block size is %zu\n", buffer_len);
audio_pos = audio_buf;
//the main thread wait for a moment
while(audio_pos < (audio_buf + buffer_len)) {
SDL_Delay(1);
}
}while(buffer_len !=0);
//close audio device
SDL_CloseAudio();
ret = 0;
__FAIL:
//release some resources
if(audio_buf){
free(audio_buf);
}
if(audio_fd){
fclose(audio_fd);
}
//quit SDL
SDL_Quit();
return ret;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具