本文通过一个简单示例讲解SDL的基本使用流程。示例中展示一个窗口,窗口里面有个随机颜色快随机移动。当我们鼠标点击关闭按钮时间窗口关闭。
基本步骤如下:
1.初始化SDL并创建一个窗口。
SDL_Init()
初始化
SDL_CreateWindow()
创建窗口
2.纹理渲染
存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一些描述信息,比如记录了矩形的大小、起始颜色、终止颜色等信息,显卡可以通过这些信息推算出矩形块的详细信息。所以相对于存储RGB而已,存储纹理占用的内存要少的多。
SDL_CreateRenderer()
创建渲染器
SDL_CreateTexture()
创建纹理
SDL_SetRenderTarget()
设置渲染目标
SDL_SetRenderDrawColor()
设置颜色
SDL_RenderClear()
清空渲染器
SDL_RenderDrawRect()
绘制矩形
SDL_RenderFillRect()
填充矩形
SDL_RenderCopy()
将目标输出到显卡
SDL_RenderPresent()
显示窗口
3.监听窗口事件,当事件为退出时关闭窗口并退出程序
SDL_PollEvent()
每隔一段时间检测事件队列,如果有时间就进行处理(这种方式不能保证有事件时能及时处理)
SDL_WaitEvent()
当有事件来时就发送一个信号进行处理,这个方法有个问题就是当由于某些原因导致事件来时没有成功发出信号进行处理,造成线程阻塞导致内存泄露。所以可以用另外一个方法SDL_WaitEventTimeout()
,这个方法在前面方法的基础上会每隔一段时间会扫描事件队列看有没有事件没处理。
4.内存释放
SDL_DestroyWindow()
销毁窗口
SDL_DestroyRenderer()
销毁渲染器
SDL_DestroyTexture()
销毁纹理
5.代码实例
代码编译时引用的库是sdl2
。
#include <stdio.h>
#include <SDL.h>
int main()
{
SDL_Window *window = NULL; // 窗口
SDL_Renderer *render = NULL;// 渲染器
SDL_Texture *texture = NULL; // 纹理
SDL_Event event; // 监听事件
int quit = 0; // 是否退出
int win_w = 640; // 窗口宽度
int win_h = 480; // 窗口高度
SDL_Rect rect; // 绘制的矩形
rect.w = 40;
rect.h = 40;
// 初始化
SDL_Init(SDL_INIT_VIDEO);
// 创建窗口,参数分别是窗口的标题,x,y,w,h,最后一个参数是一些flag(SDL_WINDOW_SHOWN表示将窗口显示出来)
window = SDL_CreateWindow("窗口标题",300,300,win_w,win_h,SDL_WINDOW_SHOWN);
if (!window)
{
printf("创建窗口失败\n");
goto __EXIT;
}
// 窗口渲染
// 创建渲染器
render = SDL_CreateRenderer(window,-1,0);// 创建渲染器
if (!render)
{
printf("创渲染器口失败\n");
goto __DESTROY;
}
// SDL_SetRenderDrawColor(render,255,0,0,255); // 设置窗口颜色,后面几个参数分别是RGBA
// SDL_RenderClear(render); // 清空窗口
// SDL_RenderPresent(render); // 将窗口展示出来
// 创建纹理(第二个参数是指明像素格式,可以是YUV或RGB,第3个参数是指明纹理类型,可以是stream(流)或target(一般类型))
texture = SDL_CreateTexture(render,SDL_PIXELFORMAT_RGBA8888,SDL_TEXTUREACCESS_TARGET,win_w,win_h);
if (!texture)
{
printf("纹理创建失败!\n");
goto __DESTROY;
}
// SDL_Delay(10000);
// 监听退出事件
do
{
// SDL_WaitEvent(&event);
SDL_PollEvent(&event);
if (event.type == SDL_QUIT)
{
quit = 1;
}else{
printf("事件类型:%d\n", event.type);
}
// 随机设置矩形位置
rect.x = rand()%600;
rect.y = rand()%440;
// 对纹理进行渲染
SDL_SetRenderTarget(render,texture); // 改变渲染目标为纹理
SDL_SetRenderDrawColor(render,255,255,255,255); // 设置纹理颜色(颜色为RGBA)
SDL_RenderClear(render); // 清空渲染器
// 绘制矩形并给矩形填充颜色
SDL_RenderDrawRect(render,&rect); // 绘制矩形
SDL_SetRenderDrawColor(render,rand()%256,rand()%256,rand()%256,255); // 给矩形设置随机色
SDL_RenderFillRect(render,&rect); // 填充
// 恢复成默认渲染目标
SDL_SetRenderTarget(render,NULL);
// 将目标输出到显卡
SDL_RenderCopy(render,texture,NULL,NULL);
SDL_RenderPresent(render); // 显卡计算完后进行显示
} while (!quit);
__DESTROY:
if (window) // 销毁window
{
SDL_DestroyWindow(window);
}
if (render) // 销毁渲染器
{
SDL_DestroyRenderer(render);
}
if (texture) // 销毁纹理
{
SDL_DestroyTexture(texture);
}
__EXIT:
// 退出
SDL_Quit();
return 0;
}
网友评论