文档章节

Ch03 在SDL中绘制图片

Mousa
 Mousa
发布于 2017/04/11 00:34
字数 715
阅读 68
收藏 0
点赞 0
评论 0
SDL

SDL 默认只支持BMP图片格式,加载图片到SDL_Texture*中,使用SDL_LoadBMP函数即可。函数原型如下。

SDL_Surface* SDL_LoadBMP(const char* file)

按照SDL官方文档,旧的SDL_Surface已经建议尽量不要使用了,因为SDL_Surface是加载到RAM中处理,而使用SDL_Texture,数据是在GPU中处理,能够使用到硬件加速,速度会快很多。但是SDL_Surface并未被废弃,在加载大图片(如地图,背景等图片),通常还是使用SDL_Surface, 对于游戏精灵等图片,推荐使用SDL_Texture.

将BMP图片加载到SDL_Texture中,可以使用如下代码。

SDL_Surface* pTempSurface = SDL_LoadBMP("assets/rider.bmp");
m_pTexture = SDL_CreateTextureFromSurface(m_pRenderer,
pTempSurface);
SDL_FreeSurface(pTempSurface);

当前游戏中所涉及的图片资源都是JPG或PNG格式,这个时候可以将SDL_Image库引用到工程中,获取更多的图片格式支持。SDL_Image支持 BMP, GIF, JPEG, LBM, PCX, PNG, PNM, TGA, TIFF, WEBP, XCF, XPM, XV 文件格式。

SDL_Texture* pTexture=IMG_LoadTexture(pRenderer,"xxx.png");

图片加载后,就可以调用SDL_RenderCopy 或SDL_RenderCopyEx函数 进行绘制。

int SDL_RenderCopy(SDL_Renderer*   renderer,
                   SDL_Texture*    texture,
                   const SDL_Rect* srcrect,
                   const SDL_Rect* dstrect);

 

SDL_RenderCopy 中srcrect 是源图片的矩形图片,赋值为NULL即是绘制整张图片,取图片的一部分则只绘制部分图片。dstrect是将srcrect内容绘制的目的矩形,赋值为NULL是绘制当前render所在的整个区间。调整这两个参数可以实现图片的部分绘制,图片的缩放。

如果要实现图片的水平或垂直反转,图片的旋转,需要调用SDL_RenderCopyEx。

int SDL_RenderCopyEx(SDL_Renderer*          renderer,
                     SDL_Texture*           texture,
                     const SDL_Rect*        srcrect,
                     const SDL_Rect*        dstrect,
                     const double           angle,
                     const SDL_Point*       center,
                     const SDL_RendererFlip flip);

本篇开头所示的图片依次示范,背景图片绘制(冰山),图片原样输出,放大2倍,缩小1倍,水平反转,垂直反转,沿顺时针方向旋转45度,沿逆时针旋转45度。

完整示例代码如下:

#include <SDL.h>
#include <SDL_image.h>
#include <iostream>
using namespace std;
SDL_Window* window = 0;
SDL_Renderer* renderer = 0;
void loadAssets();
void draw();
void cleanup();
void render();
void update();
SDL_Texture *texBackground = 0;
SDL_Texture *texTux = 0;
const SDL_Rect rc[] = {
	{0,0,64,80},  //normal
	{64,0,64*2,80*2}, //scale *2
	{190,0,64/2,80/2}, //scale* 1/2
	{260,0,64,80},//H
	{330,0,64,80 },//V
	{400,0,64,80 },//rotate
	{470,0,64,80 }//rotate

};
int main(int argc, char** argv)
{
	
	SDL_Event event;
	bool running = true;
	SDL_Init(SDL_INIT_EVERYTHING);
	SDL_CreateWindowAndRenderer(640, 480, SDL_WINDOW_SHOWN, &window, &renderer);
	SDL_SetWindowTitle(window, "Draw Image in SDL");
	loadAssets();
	while (running)
	{
		while (SDL_PollEvent(&event))
		{
			if (event.type == SDL_QUIT)
			{
				running = false;
				break;
			}
			update();
			render();
		}
	}
	
	cleanup();
	return 0;
}
void render()
{
	SDL_RenderClear(renderer);
	draw();
	SDL_RenderPresent(renderer);
}
void loadAssets()
{
	texBackground = IMG_LoadTexture(renderer, "assets/bluemountain-middle.png");
	texTux = IMG_LoadTexture(renderer, "assets/stand-0.png");
}
void cleanup()
{
	SDL_DestroyTexture(texBackground);
	SDL_DestroyTexture(texTux);
	SDL_DestroyRenderer(renderer);
	SDL_DestroyWindow(window);
	SDL_Quit();
}
void update()
{

}
void draw()
{
	SDL_RenderCopy(renderer, texBackground, NULL, NULL);
	SDL_RenderCopy(renderer, texTux, NULL, &rc[0]);
	SDL_RenderCopy(renderer, texTux, NULL, &rc[1]);
	SDL_RenderCopy(renderer, texTux, NULL, &rc[2]);
	SDL_RenderCopyEx(renderer, texTux, NULL, &rc[3], 0, 0, SDL_FLIP_HORIZONTAL);
	SDL_RenderCopyEx(renderer, texTux, NULL, &rc[4], 0, 0, SDL_FLIP_VERTICAL);
	SDL_RenderCopyEx(renderer, texTux, NULL, &rc[5], 45, 0, SDL_FLIP_NONE);
	SDL_RenderCopyEx(renderer, texTux, NULL, &rc[6], -45, 0, SDL_FLIP_NONE);
}

 

© 著作权归作者所有

共有 人打赏支持
Mousa
粉丝 17
博文 7
码字总数 8690
作品 0
苏州
程序员
SDL_Engine游戏引擎制作 4-Surface 1.x的遗孀

SDL自更新至2.x后,原先在1.x大放异彩的SDLSurface大部分功能被SDLTexture所取代,如渲染。不过SDLSurface还是有用武之地的,比如在使用SDLttf.h的部分函数时还是需要用到SDLSurface,之后再...

bull521
03/28
0
0
SDL系列讲解(十二)创建窗口流程

SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四) demo讲解 SDL系列讲解(五) 调试c代码 SD...

代码GG陆晓明
2017/10/28
0
0
SDL2源代码分析4:纹理(SDL_Texture)

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/05
0
0
SDL2源代码分析7:显示(SDL_RenderPresent())

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/09
0
0
SDL2源代码分析5:更新纹理(SDL_UpdateTexture())

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/07
0
0
SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/08
0
0
最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x) 最简单的基于FFMPEG+...

leixiaohua1020
2015/07/16
0
0
SDL2源代码分析2:窗口(SDL_Window)

===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDLInit()) SDL2源代码分析2:窗口(SDLWindow) SDL2源代码分析3:渲染器...

leixiaohua1020
2014/11/03
0
0
Tao Framework

Tao提供的所有库都是完全开源的。其中的多数库都可以免费用在商业项目中,但还是有必要阅读许可证中列出的具体说明。Tao是一个出色的程序包,刚开始涉足游戏的开发商可以把它作为一个起点。 ...

真是杨晓光
2015/01/19
2.1K
0
使用SDL进行图片的切割与移动(三)

不知不觉都做到这里了,是不是再学习完音频之后就考虑做个小游戏呢?可惜不会PS呢... 国庆每天的娱乐活动就是搞搞SDL,和朋友打打篮球,看看电影,吃吃美食之类的,很爽了。 哈哈,切入正题吧...

夲仒無道
2013/10/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部