作者:龙飞
这两天下雨,所以就暂停了寻春的步伐,多写了点教程。
绵阳的春天是美丽的,大家学习和写程序之余,还是应该多看看大自然。给大家推荐我拍的风景照啦,呵呵。 http://picasaweb.google.com/firefly.cao
因为不想多上传图片,所以我的例子中的图片文件直接就用Lazy Foo's教程中的附件了。相关资源,大家可以在这里下载: Clip Blitting and Sprite Sheets
1.1:什么是精灵?
如果有很多很多的图片,不想发布游戏的时候包含n多小小的图片文件,那么可以考虑把小图片都画在一张大图上,然后“抠”下来用,不也是很方便吗?这张大图就叫精灵图(Sprite sheet)。每一个抠下来的图片就叫精灵啦。
精灵只是一种技巧,需要的知识,我们前面都已经学习过了。我们稍微修改一下类,就可以很好的演示这个技术实现。
1.2:填充背景的颜色
int
SDL_FillRect(SDL_Surface
*
dst, SDL_Rect
*
dstrect, Uint32 color);
这个函数是往一个指定surface的指定矩形区域中填充指定的颜色。如果指定矩形区域为空指针,则填充整个surface。值得注意的是,SDL_Surface结构中包含矩形区域的只读成员数据是clip_rect。我们为ScreenSurface类增加一个方法,默认填充黑色。
class
ScreenSurface
{
private
:
//
public
:
//
void
fillColor(Uint8 r
=
0
, Uint8 g
=
0
, Uint8 b
=
0
)
const
;
};
实现为:
void
ScreenSurface::fillColor(Uint8 r, Uint8 g, Uint8 b)
const
{
if
( SDL_FillRect(pScreen,
0
, SDL_MapRGB(pScreen
->
format, r, g, b))
<
0
)
throw
ErrorInfo(SDL_GetError());
}
1.3:思路
我们先创建一个ScreenSurface对象,并将其填充为白色作为背景。装载精灵图之后,先抠掉精灵图的背景色,然后按照区域,分4次将4个图片小精灵blit到背景上。非常简单!需要说明的是,我修改了局部blit()方法偏移值的默认参数值。因为在之前的章节中,局部blit()主要用于blit部分背景将背景“搽干净”,需要将偏移设为非零;而我们现在使用这个方法的主要目的是抠精灵图片,如果偏移非零的话就会把设定范围之外的图像也抠过来,而这不是我们希望发生的。下节给出完整源代码。