参考
SDL源码学习
参考教程1
参考教程2
SDL雷神
SDL介绍雷神
SDL教程中心
前期准备
SDL2-devel-2.0.9
SDL2_image-2.0.4
准备一张bmp图片
然后配置库啥的我不教了 基本知识 实在不行 跑我的demo 我的是cmake搭建的 有点复杂
初始化并创建窗口 用来绘制画面
if (SDL_Init(SDL_INIT_VIDEO)) //选择渲染视频画面
{
std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_Window *win = SDL_CreateWindow(
"Hello World!",//标题
100, 100,//坐标
640, 480, //窗口宽高
SDL_WINDOW_SHOWN//标志 显示 另外还有其他全屏,隐藏等标志
);
if (win == nullptr)
{
std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
return 1;
}
SDL_CreateWindow这个函数的作用是为我们创建一个窗口,并且返回一个SDL_Window指针。这个函数的第一个参数是窗口的标题,之后是窗口所打开的位置的x,y坐标,之后的参数是窗口的长度和宽度。最后一个参数是窗口的各种flag,因为我们想要窗口在创建之后马上弹出,所以这里我们填SDL_WINDOW_SHOWN。
获取SDL_Renderer
为了渲染图片到窗口,得获取SDL_Renderer
// SDL_CreateRenderer 窗口句柄 指定显卡驱动(-1为自动选择)
// SDL_RENDERER_ACCELERATED,因为我们想使用硬件加速的renderer
// SDL_RENDERER_PRESENTVSYNC标志,因为我们想要使用SDL_RendererPresent这个函数,这个函数将会以显示器的刷新率来更新画面
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (ren == nullptr)
{
SDL_DestroyWindow(win);
std::cout << "SDL_CreateRender Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
将bmp图片图片载入Surface
std::string imagePath = BMP_PATH;
//Surface 可以把它理解为一个Buffer,它是一块屏幕缓冲区。
//每个Window(窗口)对应一个Surface,任何View都是画在Surface上的
SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str());
//SDL_Surface *bmp = IMG_Load(imagePath.c_str());
if (bmp == nullptr)
{
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
std::cout << "SDL_LoadBMP Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
创建Texture
//SDL_Texture来用硬件加速绘制图像
SDL_Texture *tex = SDL_CreateTextureFromSurface(ren, bmp);
SDL_FreeSurface(bmp);
if (tex == nullptr)
{
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
std::cout << "SDL_CreateTextureFromSurface Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
开始绘制
现在我们可以把Texture画到renderer上了。首先,我们先使用SDL_RenderClear来清空屏幕,然后我们使用SDL_RenderCopy来把texture画上去。最后,我们使用SDL_RenderPresent来更新屏幕的画面。
SDL_RenderClear(ren);
//texture画上去
//第一个NULL是一个指向源矩形的指针,也就是说,从图像上裁剪下的一块矩形
//而另一个是指向目标矩形的指针。我们将NULL传入这两个参数,
//是告诉SDL绘制整个源图像(第一个NULL),并把它画在屏幕上(0,0 )的位置,并拉伸这个图像让它填满整个窗口(第二个NULL)
SDL_RenderCopy(ren, tex, NULL, NULL);//
SDL_RenderPresent(ren);// SDL_RenderPresent来更新屏幕的画面
SDL_Delay(10000);
这里我们给SDL_RenderCopy传了两个NULL值。第一个NULL是一个指向源矩形的指针,也就是说,从图像上裁剪下的一块矩形;而另一个是指向目标矩形的指针。我们将NULL传入这两个参数,是告诉SDL绘制整个源图像(第一个NULL),并把它画在屏幕上(0,0 )的位置,并拉伸这个图像让它填满整个窗口(第二个NULL)。这一点以后还会详细说明。
销毁资源
//必要释放掉我们这个窗口、renderer还有texture所用的全部内存
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
补充
SDL2_image-2.0.5会有点问题 dll找不到dwClose等等
推荐使用SDL2_image-2.0.4 的
IMG_Load(url);
替换
SDL_LoadBMP(imagePath.c_str());
总结
1.创建窗口
2.创建Render
3.载入图片到屏幕缓冲区Surface
4.Surface载入到纹理Texture后 用Render渲染Surface
5.依次销毁Texture,Render,Window