SDL教程-创建窗体& 显示bmp图片
note1. hello,world
#include <iostream>
#include <SDL.h>
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
return(1);
SDL_Delay(2000);
SDL_Quit();
return 0;
}
note2. sdl 展示一张bmp图片
#include <iostream>
#include <SDL.h>
int main(int argc, char* argv[])
{
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_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;
}
std::string imagePath = "G:\\code\\AudioDemo\\Res\\bmps\\childrensday.bmp";
SDL_Surface *bmp = SDL_LoadBMP(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;
}
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;
}
for (int i = 0; i < 3; ++i)
{
SDL_RenderClear(ren);
SDL_RenderCopy(ren, tex, NULL, NULL);
SDL_RenderPresent(ren);
SDL_Delay(10000);
}
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
默认SDL2 支持BMP格式图片的加载,示例如上代码,接下来,介绍的是SDL加载其他格式的图片jpeg,png,webp…格式
依赖新的库:SDL_image
https://www.libsdl.org/projects/SDL_image/
下载对应平台的SDL_Image库,我是win平台vs2013开发,所以下载是SDL2_image-devel-2.0.5-VC.zip (Visual C++ 32/64-bit)这个。
与加载BMP方式唯一的不同是改了如下加载函数即可。
std::string imagePath = "G:\\code\\AudioDemo\\Res\\jpgs\\015.jpg";
SDL_Surface *bmp = IMG_Load(imagePath.c_str());
完整代码如下:
#include <iostream>
#include <SDL.h>
#include <SDL_image.h>
int main(int argc, char* argv[])
{
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_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;
}
//std::string imagePath = "G:\\code\\AudioDemo\\Res\\bmps\\childrensday.bmp";
//SDL_Surface *bmp = SDL_LoadBMP(imagePath.c_str());
std::string imagePath = "G:\\code\\AudioDemo\\Res\\jpgs\\015.jpg";
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;
}
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;
}
for (int i = 0; i < 3; ++i)
{
SDL_RenderClear(ren);
SDL_RenderCopy(ren, tex, NULL, NULL);
SDL_RenderPresent(ren);
SDL_Delay(10000);
}
SDL_DestroyTexture(tex);
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}