写给信息学竞赛选手的趣味编程 基于DevC++的SDL2图形程序设计(二) 第一个图形程序

基于DevC++的SDL2图形程序设计(二) 第一个图形程序



前言

根据上一篇文章的内容准备好DevC++的编程环境后,咱们开始第一个图形程序。本节源代码和图片资料链接如下:
链接:https://pan.baidu.com/s/1OVo37SYtolZWL89bU1D9Xw
提取码:d3go


一、编写程序

问题描述:在窗口中显示一幅图片。
具体操作:
第一步:准备一张图片,图片可以从网上下载,也可以使用资源包中的图片(也是从网上下载的)。该图片分辨率为1280*720.注意图片要与程序在同一个文件夹。
第二步:编写程序如下:

1.	#include "SDL.h"
2.	#include "SDL_image.h"
3.	int main(int argc, char* argv[]){
4.	    SDL_Init(SDL_INIT_EVERYTHING);
5.	    SDL_Window *window= SDL_CreateWindow("first", 80, 100, 1280, 720,0);
6.	    //SDL_Window *window= SDL_CreateWindow("first", 100, 100, 1280, 720,SDL_WINDOW_BORDERLESS);
7.	    //SDL_Window *window= SDL_CreateWindow("first", 100, 100, 1280, 720,SDL_WINDOW_FULLSCREEN);
8.	    SDL_Renderer* renderer= SDL_CreateRenderer(window, -1, 0);
9.	    SDL_Surface *bg =IMG_Load("douluo1280_720.jpeg");//表面
10.	    SDL_Texture *bgT=SDL_CreateTextureFromSurface(renderer, bg);//纹理
11.	    SDL_RenderClear(renderer);
12.	    SDL_RenderCopy(renderer,bgT, NULL, NULL);
13.	    SDL_RenderPresent(renderer);   
14.	    SDL_Delay(6000); 
15.	    SDL_FreeSurface(bg);
16.	    SDL_DestroyTexture(bgT);
17.	    SDL_DestroyRenderer(renderer);
18.	    SDL_DestroyWindow(window);
19.	    SDL_Quit();
20.	    return 0;
21.	}

第三步:编译运行效果如下:图2- 1程序执行效果

二、SDL显示图片过程说明

1.核心数据结构

在图像显示过程中有四个核心数据结构,包括窗口、渲染器、表面和纹理。下面分别介绍。

(1)窗口Window

SDL_Window是一个窗口结构体,存放了所有与Window有关的信息,比如标题、位置、长宽和边框等等。

(2)渲染器Renderer

SDL_Renderer是一个渲染器结构体,存放了与所有渲染有关的信息,类似于画布。显示图像过程就是对于渲染器的操作。显示图像的基本步骤包括:清空渲染器、复制新图像、刷新渲染器。

(3)表面Surface 和纹理Texture

渲染器SDL_Renderer会绘制纹理SDL_Texture,纹理SDL_Texture与表面SDL_Surface很像,不同的是表面SDL_Surface使用软件绘制(CPU)而SDL_Texture使用硬件绘制(GPU)。

2.显示图片流程简介

SDL显示图片的过程从启动SDL到结束SDL分为三个部分共8步。
第一部分是预处理,搭建环境包括初始化SDL、创建窗口、创建渲染器、创建表面和创建纹理;
第二部分是显示核心操作包括清空渲染器、载入图片到渲染器和显示渲染器内容;
第三部分是释放资源包括释放表面,销毁纹理、销毁渲染器、销毁窗口和退出SDL。
具体执行过程如图所示。
图2- 2 显示图片的执行过程示意图

3.代码详解

(1)导入工具包,定义主函数头。

图2- 3程序第一部分
第1行 包含我们要用的SDL库
第2行 包含SDL-image第三方图图形库
因为SDL库只支持使用bmp图像格式,所以需要用SDL-image库来加载png或jpg格式的图像。
第3行 定义main函数
由于SDL内部重定义了main, main函数一定得是这个形式,而事实上这才是main该有的模样。就像许多cmd命令执行时可以有参数一样,我们自己编写的程序在命令行方式执行时也可以加入参数。这时程序中的argc用于记录参数的个数,argv指针数组存放所有的参数。如果你还是不理解第3行,也没关系记住就好了。

(2)创建环境

图2- 4程序第二部分
第4行 初始化SDL库
函数原型***:int SDL_Init(Uint32 flags)***
参数说明:flags表示初始化模式。SDL_INIT_EVERYTHING表示初始化所有SDL的子系统,包括:定时器、音频、视频、操纵杆、触觉(力反馈)、游戏控制器和事件等子系统。
返回值:初始化成功返回0,失败返回一个负的错误码。
注意:这个函数必须在使用SDL功能之前调用。
第5行 创建窗口
函数原型:
SDL_Window SDL_CreateWindow(const char title, int x, int y, int w, int h, Uint32 flags)**
参数说明:
title表示窗口标题字符串,采用UTF-8编码(不支持中文);
X和y表示窗口左上角的坐标;
W和h表示窗口的宽和高;
Flags表示窗口显示模式。显示模式有很多种,其中第5行参数为0表示正常窗口显示,而屏蔽掉的第6行SDL_WINDOW_BORDERLESS 表示无边框显示;第7行SDL_WINDOW_FULLSCREEN表示全屏显示。注意只能创建一个Window。
返回值:创建成功返回一个指向窗口的指针,失败返回NULL。
第8行 创建渲染器
函数原型:
SDL_Renderer SDL_CreateRenderer(SDL_Window window, int index, Uint32 flags)**
参数说明:
Window表示渲染器所在的窗口指针;
Index=-1表示初始化一个渲染器;
flags =0表示采用硬件加速的渲染器。
返回值:创建成功返回一个指向该渲染器的指针,失败返回NULL。
第9行 加载图像到surface
函数原型:
SDL_Surface SDL_Load(SDL_RWops src)**
参数说明:
src表示打开图像的路径;
返回值:创建成功返回一个包含该图片的表面(surface)指针,失败返回NULL。
注意:SDL本身只支持bmp图,调用第三方库SDL_image后可以支持png,jpg等格式图片,图片名称是utf-8编码,只支持西文字符。
第10行 使用一个已经存在的surface创建一个纹理texture
函数原型:
SDL_Texture SDL_CreateTextureFromSurface(SDL_Renderer renderer, SDL_Surface surface)***
参数说明:略
返回值:创建成功返回一个指向该纹理的指针,失败返回NULL。
至此,创建环境完毕。

(3)显示图片

图2- 5程序第三部分
显示图片的过程本质上是对渲染器的操作。具体包括清除、载入图片、显示和延时四个部分。
第11行 清除渲染器原有内容
函数原型:
int SDL_RenderClear(SDL_Renderer renderer)*
参数说明:
Renderer表示待清除的渲染器指针
返回值:创建成功返回一个指向该纹理的指针,失败返回NULL。
第12行 将纹理载入到渲染器
函数原型:
int SDL_RenderCopy(SDL_Renderer renderer,
SDL_Texture
texture,
const SDL_Rect
srcrect,
const SDL_Rect* dstrect)***
参数说明:
Renderer表示渲染器指针
Texture表示纹理指针
Srcrect 表示获取源纹理的一个矩形区域填充渲染器,NULL表示整个纹理
Dstrect表示用纹理填充目标渲染器的一个矩形区域,NULL表示这个渲染器。
返回值:返回值为0表示复制成功,为一个负数表示操作失败。
第13行 更新屏幕渲染器
函数原型:
void SDL_RenderPresent(SDL_Renderer renderer)*
参数说明:
Renderer表示渲染器指针
第14行 延时
函数原型:
void SDL_Delay(Uint32 ms)
参数说明:
Ms表示一个时间的整数,单位是毫秒。
注意:因为更新屏幕显示会很快,所以需要用delay来配合延长显示时间。

(4)释放资源

图2- 6程序第四部分
本部分主要操作是释放surface、销毁texture、renderer和window,退出SDL。具体函数说明由于操作比较简单所以略掉了。
注意:由于C++没有自动垃圾回收器,在程序结束时不能自动释放内存中的资源,所以需要手动释放内存。


总结

至此,程序解释完毕。不知大家是否理解了SDL显示图像的机制。


版权声明:本文为zotion_male原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。