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: %s\n", path.c_str(), SDL_GetError() );
	}
	else
	{
		//将表面转换为屏幕格式
		optimizedSurface = SDL_ConvertSurface( loadedSurface, gScreenSurface->format, 0 );
		if( optimizedSurface == NULL )
		{
			printf( "Unable to optimize image %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
		}

		//释放旧的负载表面
		SDL_FreeSurface( loadedSurface );
	}

	return optimizedSurface;
}

回到我们的图像加载函数中,我们要做一些修改,以便在加载时转换表面。在函数的顶部,我们几乎像之前的教程一样加载图像,但我们也声明一个指向最终优化图像的指针。

如果前面几行代码中图像加载成功,我们就优化我们加载的表面。

当你加载一个位图时,它通常是以24bit格式加载的,因为大多数位图都是24bit的。大多数(如果不是全部)现代显示器默认不是24bit的。如果我们将一张24bit的图像混合到32bit的图像上,SDL将在每次图像混合时对其进行转换。

因此,当图像被加载时,我们要做的是将其转换为与屏幕相同的格式,这样就不需要在blit时进行转换。这可以通过SDL_ConvertSurface轻松完成。我们所要做的就是将我们想要转换的表面与屏幕的格式一起传递进来。

需要注意的是,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。与之前的blit图像一样,SDL_BlitScaled 接收一个源表面,以便将其拼接到目标表面上,同时还接收一个目标 SDL_Rect,它定义了你要拼接的图像的位置和大小。它也接收一个目标 SDL_Rect,它定义了图像的位置和大小。

所以,如果我们想把一个比屏幕小的图像变成屏幕的大小,你可以把目标宽度/高度变成屏幕的宽度/高度。

这里下载本教程的媒体和源代码。

原文链接

关注我的公众号:编程之路从0到1
编程之路从0到1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值