• 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
    ", 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
    ", 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);
    

    总体流程:

  • 相关阅读:
    使用Kuboard界面在k8s上部署SpringCloud项目
    改造项目使用的Dockerfile文件
    在Kuboard上安装 Ingress Controller
    解决nexus仓库只能拉取不能推送的问题
    Logstash:运用 memcache 过滤器进行大规模的数据丰富
    Docker Compose配置文件详解(V3)
    Dockerfile 和 docker-compose.yml的区别
    实战---在Portainer中编排docker-compose.yml文件
    ctk-获取MANIFEST.MF中的数据
    继承时的析构函数
  • 原文地址:https://www.cnblogs.com/xl2432/p/11707933.html
Copyright © 2020-2023  润新知