SDL2学习(一): 显示一张图片

SDL是一个跨平台的多媒体库,它通过OpenGL和2D视频帧缓冲,提供了针对音频、视频、键盘、鼠标、控制杆及3D硬件的低级别的访问接口。这里使用较新的SDL2库。

1. 配置SDL开发环境

1.1 下载SDL开发库

下载地址:http://www.libsdl.org/download-2.0.php;选择SDL2-devel-2.0.10-VC.zip。解压后的目录如下:
image.png

1.2 配置环境

使用VS新建一个C++控制台工程,并做如下配置:

  • 将解压后的SDK库拷贝到工程目录下,然后配置VS工程;
  • "C/C++"-->"常规"-->"附加包目录",填入SDL的相对include目录;

image.png

  • "链接器"-->"常规"-->"附加库目录",填入SDL的相对lib目录。

image.png

  • "C++"-->"代码生成"-->"运行库",选择"多线程 DLL(/MD)"

image.png

  • "链接器"-->"系统"-->"子系统"更改为"窗口"

image.png

  • 最后,为了不每次都需要将dll拷贝到exe所在目录,配置"调试"-->"环境",设置为"PATH=sdl/lib/x86;%PATH%",但是要注意如果是直接运行exe,还需要将对应的dll拷贝到和exe一起。

2. 编写代码实现

首先,通过以下代码验证SDL配置成功:

#include "SDL.h"

#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")

int main(int argc, char* args[])
{
	//启动SDL
	SDL_Init(SDL_INIT_EVERYTHING);

	//退出SDL 
	SDL_Quit();

	return 0;
}

使用SDL2需要注意几点:

  • 和sdl 1.x版本有些接口差别较大,不能直接套用;
  • 没有对SDL进行初始化,则无法调用任何SDL函数;
  • 退出前注意释放资源。

下面是使用SDL2显示一张bmp图片的代码:

#include "SDL.h"
#include <iostream>

#pragma comment(lib, "SDL2.lib")
#pragma comment(lib, "SDL2main.lib")

int main(int argc, char* args[])
{
	//窗口含有的surface
	SDL_Surface* screenSurface = NULL;

	//初始化SDL
	if (SDL_Init(SDL_INIT_VIDEO) < 0)
	{
		printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());
	}
	else {
		//创建 window
		SDL_Window *window = SDL_CreateWindow("ShowPicture", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
		if (window == NULL)
		{
			printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());
		}
		else {
			//渲染层
			SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);
			SDL_Surface *pic = SDL_LoadBMP("sdl_test.bmp");
			//载入的图片生成SDL材质
			SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, pic);

                        //把材质复制到渲染器
			SDL_RenderCopy(renderer, texture, NULL, NULL);
			//显示出来
			SDL_RenderPresent(renderer);

			bool quit = false;
			SDL_Event event;

			while (!quit)
			{//主消息循环
				SDL_WaitEvent(&event);

				switch (event.type)
				{   
				//用户从菜单要求退出程序
				case SDL_QUIT:
					quit = true;
					break;
				}
			}

			// 清理资源
			SDL_DestroyTexture(texture);
			SDL_FreeSurface(pic);
			SDL_DestroyRenderer(renderer);
			SDL_DestroyWindow(window);
		}
	}

	//退出SDL 
	SDL_Quit();

	return 0;
}

image.png
如果要显示jpg等其他格式的图片,需要引入image库(同样要下载sdl2_image库):

//引入image库
IMG_Init(IMG_INIT_JPG); 
SDL_Surface * image = IMG_Load("*.png");

//退出image库
IMG_Quit();

如果需要指定图片的渲染位置,可以这样实现:

SDL_Rect dstrect = { 5, 5, 320, 240 };
SDL_RenderCopy(renderer, texture, NULL, &dstrect);
SDL_RenderPresent(renderer);

总体流程:

posted @ 2019-10-20 16:15  星星,风,阳光  阅读(10382)  评论(0编辑  收藏  举报