(译)SDL编程入门(5)Surface 优化和软拉伸
Surface 优化和软拉伸
到现在为止,我们一直都是将我们的图像原始地融合在一起。因为我们只显示一张图片,所以这并不重要。当你在做游戏的时候,原始图像会导致不必要的减速。我们将把它们转换为优化的格式来加快它们的速度。
SDL2还为SDL表面提供了一个新的功能,叫做软拉伸,它允许你将图像按比例放大到不同的尺寸进行blit。在本教程中,我们将把一张只有屏幕一半大小的图像拉伸到全尺寸。
SDL_Surface* loadSurface( std::string path ){
//最终优化后的图像
SDL_Surface* optimizedSurface = NULL;
//在指定路径加载图像
SDL_Surface* loadedSurface = SDL_LoadBMP( path.c_str() );
if( loadedSurface == NULL )
{
printf( "Unable to load image %s! SDL Error: %sn", path.c_str(), SDL_GetError() );
}
else
{
//将表面转换为屏幕格式
optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format, 0 );
if( optimizedSurface == NULL )
{
printf( "Unable to optimize image %s! SDL Error: %sn", path.c_str(), SDL_GetError() );
}
//释放旧的负载表面
SDL_FreeSurface( loadedSurface );
}
return optimizedSurface;
}
回到我们的图像加载函数中,我们要做一些修改,以便在加载时转换表面。在函数的顶部,我们几乎像之前的教程一样加载图像,但我们也声明一个指向最终优化图像的指针。
如果前面几行代码中图像加载成功,我们就优化我们加载的表面。
当你加载一个位图时,它通常是以24bit格式加载的,因为大多数位图都是24bit的。大多数(如果不是全部)现代显示器默认不是24bit的。如果我们将一张24bit的图像混合到32bit的图像上,SDL将在每次图像混合时对其进行转换。
因此,当图像被加载时,我们要做的是将其转换为与屏幕相同的格式,这样就不需要在blit时进行转换。这可以通过SDL_ConvertSurface[1]轻松完成。我们所要做的就是将我们想要转换的表面与屏幕的格式一起传递进来。
需要注意的是,SDL_ConvertSurface会以新的格式返回一个原图的副本。在这个调用之后,原来加载的图像仍然在内存中。这意味着我们必须释放原始加载的表面,否则我们将在内存中拥有两个相同图像的副本。
在图像加载和转换之后,我们返回最终优化后的图像。
//应用图像拉伸
SDL_Rect stretchRect;
stretchRect.x = 0;
stretchRect.y = 0;
stretchRect.w = SCREEN_WIDTH;
stretchRect.h = SCREEN_HEIGHT;
SDL_BlitScaled( gStretchedSurface, NULL, gScreenSurface, &stretchRect );
SDL2 有一个新的专用功能,可以将图像blit 成不同的大小:SDL_BlitScaled[2]。与之前的blit图像[3]一样,SDL_BlitScaled 接收一个源表面,以便将其拼接到目标表面上,同时还接收一个目标 SDL_Rect[4],它定义了你要拼接的图像的位置和大小。它也接收一个目标 SDL_Rect,它定义了图像的位置和大小。
所以,如果我们想把一个比屏幕小的图像变成屏幕的大小,你可以把目标宽度/高度变成屏幕的宽度/高度。
参考资料
[1]
SDL_ConvertSurface: https://wiki.libsdl.org/SDL_ConvertSurface
[2]
SDL_BlitScaled: https://wiki.libsdl.org/SDL_BlitScaled
[3]
blit图像: https://blog.csdn.net/yingshukun/article/details/108666196
[4]
SDL_Rect: https://wiki.libsdl.org/SDL_Rect
[5]
这里: http://www.lazyfoo.net/tutorials/SDL/05_optimized_surface_loading_and_soft_stretching/05_optimized_surface_loading_and_soft_stretching.zip
[6]
原文链接: http://www.lazyfoo.net/tutorials/SDL/05_optimized_surface_loading_and_soft_stretching/index.php
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- html 的div或其他元素监听 resize事件不生效的解决办法
- 基于docker部署skywalking实现全链路监控
- 数据结构与算法(二)——十大排序算法
- VUE项目使用.env文件配置全局环境变量
- 设计模式学习(六)-抽象工厂模式
- 彻底完美解决安卓苹果手机点击输入框网页页面自动放大缩小
- 第22天:NLP实战(六)——基于PaddleHub的疫情期间网民情绪识别
- Echarts大数据可视化物流航向省份流向迁徙动态图,开发全解+完美参数注释
- Linux 常用操作以及概念
- GCD梳理与总结——封装
- 原生JS在网页上复制的所有文字后面自动加上一段版权声明
- 使用宝塔docker安装为知笔记私有部署
- 第4天:美团点评2020校招测试方向笔试试卷分析
- Element-UI饿了么时间组件控件按月份周日期,开始时间结束时间范围限制参数
- 微信小程序flex布局