1. 新建一个窗体并添加事件监听与响应
- SDL_Init(),首先是按照需求对SDL相关子系统进行初始化,在程序最后退出之前需要使用SDL_Quit()清理所有初始化的子系统。
- SDL_CreateWindow()创建一个窗体,SDL_DestroyWindow()销毁窗体。
- SDL_Event定于一个事件,SDL_PollEvent()当前挂起事件的轮询。
- SDL_Delay(),延时指定的ms时间长度。
#include <stdio.h>
#include <SDL.h>
#undef main
int main()
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
SDL_Log("init failed : %s", SDL_GetError());
return -1;
}
SDL_Window * win = SDL_CreateWindow("sdl window",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
640, 480,
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
if (win == NULL)
{
SDL_Log("create window failed : %s", SDL_GetError());
SDL_Quit();
return -1;
}
SDL_Event event;
while(1)
{
if (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
break;
}
}
SDL_Delay(10);
}
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
2.新建窗体并获取与窗体相关的Surface并绘制一个矩形
- 新建窗体、添加事件监听与响应,参考上述1中的操作。
- SDL_GetWindowSurface()获取与窗口关联的SDL表面,使用完成后调用SDL_FreeSurface()释放Surface资源。
- SDL_Rect定义一个矩形,使用SDL_FillRect()对矩形进行填充,填充时需要指定像素颜色,可以使用Uint32类型数指定,也可以使用SDL_MapRGB()来指定。
- 使用SDL_UpdateWindowSurface()将窗口表面复制到屏幕上。
#include <stdio.h>
#include <SDL.h>
#undef main
int main()
{
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
SDL_Log("init failed : %s", SDL_GetError());
return -1;
}
SDL_Window * win = SDL_CreateWindow("sdl window",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
640, 480,
SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
if (win == NULL)
{
SDL_Log("create window failed : %s", SDL_GetError());
SDL_Quit();
return -1;
}
SDL_Surface *surface = SDL_GetWindowSurface(win);
if (surface == NULL)
{
SDL_Log("init failed : %s", SDL_GetError());
SDL_DestroyWindow(win);
SDL_Quit();
return -1;
}
SDL_Rect rect = {0, 190, 100, 100};
// 使用SDL_FillRect(surface, &rect, 0x00ff0000)替代下面一行代码,同样的效果
SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 255, 0, 0));
SDL_UpdateWindowSurface(win);
SDL_Event event;
while(1)
{
if (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
{
break;
}
}
SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 0, 0, 0));
rect.x += 1;
SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 255, 0, 0));
SDL_UpdateWindowSurface(win);
SDL_Delay(10);
}
SDL_FreeSurface(surface);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
3.获取新建窗体的Surface并显示BMP格式图片
- SDL核心库只支持BMP格式的图片显示,其他格式的显示需要加SDL_image模块。
- SDL_loadBMP()打开一张BMP图片,之后返回SDL_Surface指针,所以也需要在结束时使用SDL_FreeSurface()释放。
- SDL_BlitSurface()执行从源表面到位置表面的位块传输。
- SDL_UpdateWindowSurface()
SDL_Surface *surface_bmp = SDL_LoadBMP("image.bmp");
if (surface_bmp == NULL)
{
SDL_Log("load BMP image failed : %s", SDL_GetError());
return -1;
}
SDL_BlitSurface(surface_bmp, NULL, surface, NULL);
SDL_UpdateWindowSurface(win);
4.渲染器
- SDL_CreateRenderer()创建一个2D渲染器上下文,需要指定显示呈现的窗口,要初始化的渲染驱动程序索引(可以使用-1初始化支持请求标志的第一个驱动程序),创建时指定的flag。在结束时需要使用SDL_DestroyRenderer()释放资源。
- SDL_SetRendererDrawColor()设置用于绘图操作的颜色(矩形、直线和清屏)。
- SDL_RenderClear()用绘图颜色清除当前渲染目标。
- SDL_RenderPresent()更新已执行渲染的屏幕。
SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
if (renderer == NULL)
{
SDL_Log("SDL create renderer fialed: %s", SDL_GetError());
return -1;
}
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_DestroyRenderer(renderer);