- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[第2课-优化表面的加载和Blit
第2课 - 优化表面的加载和Blit
更新时间:2012年6月29日
原文链接
上一课
下一课
既然你已经在上一课的第二部分学会了在窗口中显示一张图片,那么现在是时候改用更高效的方法加载表面和Blit。
译者注:Blit的含义是内存中图像的位块传输,指的是将某一表面的全部或部分图像复制到另一表面上。只是我不清楚把它翻译成“位块传输”是否合适,故不翻译此词汇,应该不会影响阅读和理解。
//头文件
#include SDL/SDL.h
#include string
这些是这个程序所用到的头文件。SDL.h被包含了进来,很明显是因为我们要使用其中的函数。string头文件也被包含了进来...呃...我不喜欢使用char*,更喜欢用std::string。
//窗口属性
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;
这里有多个不同的窗口属性。我确信你能看出来SCREEN_WIDTH 和 SCREEN_HEIGHT 的含义。SCREEN_BPP 是位/像素。这里所有的教程都是用的32位颜色。
译者注:目前基本所有图形化的操作系统默认都采用32位色(即“真彩色“)显示整个视窗系统,即每一像素用32位表示,其中分别是红色、绿色、蓝色和Alpha混合(即RGBA),各占8位。
//将要使用的表面
SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;
这是3个即将使用的图像表面。background 很明显是背景图片, message 是一张写着Hello字样的图片, screen 很明显是程序窗口。记住:在不使用一个指针变量时,将它设为NULL,这是一个很好的习惯。.
SDL_Surface *load_image( std::string filename )
{
//临时的空间,用于存储刚刚加载好的图像
SDL_Surface* loadedImage = NULL;
//优化后的图像,实际使用的是这个图像
SDL_Surface* optimizedImage = NULL;
这是我们加载图片的函数。译者注:std::string是C++的String,如果您不了解C++,也可以使用C的String,即char*或char数组。下面代码中用到的filename.c_str()是C++ String的取指针操作,返回类型为char*,指向字符串首字符地址,即可理解为C++ String转C String,所以这里用哪种String都没问题。
这个函数的作用是加载一张图片,然后返回一个指向优化后的图像表面的指针。其中参数filename是要加载的图片的文件路径。 loadedImage 是我们加载好图像后得到的表面。optimizedImage 是最终实际使用的表面。
//加载图像
loadedImage = SDL_LoadBMP( filename.c_str() );
一开始,图像是通过SDL_LoadBMP()加载的。但是这个图像不能立即使用,因为这个位图是24位色的,而窗口是32位色的, 将一个表面blit到另一个不同格式的表面上不是一个好主意,因为这样SDL会在每次blit时做一次临时性的格式转换,这会导致程序的运行效率降低。
//如果加载图片没有出错
if( loadedImage != NULL )
{
//创建一个优化了的图像
optimizedImage = SDL_DisplayFormat( loadedImage );
//释放临时的图像
SDL_FreeSurface( loadedImage );
}
下面我们要检查一下图片是否加载成功,如果加载发生了错误,loadedImage会被设为NULL。如果图片加载成功,我们就调用SDL_DisplayFormat() 来创建一个与窗口拥有同样格式的新版本的图像。之所以这么做,是因为当你尝试将一个表面粘贴到另一个不同格式的表面时,SDL会自动转换它的格式,使它们具有相同的格式。而在每次blit时都创建一个转换后的表面会浪费机器的处理能力并降低程序运行速度。由于我们在加载表面时就已经将其格式转换好了,所以当你要将此表面应用到窗口上时,它已经与窗口具有相同格式,那么SDL就不必进行临时的格式转换了。所以现在我们有2个表面:旧的加载得到的表面和新的优化处理后的表面。
SDL_DisplayFormat()创建了一个优化后的表面,但是没有去除原来的表面。
文档评论(0)