现在的位置: 首页 > 综合 > 正文

DirectX游戏编程入门——第二部分(游戏编程工具箱) ——精灵编程之动画的精灵

2013年05月26日 ⁄ 综合 ⁄ 共 1346字 ⁄ 字号 评论关闭

        本系列文章由 net_assassin 整理编写,转载请注明出处。

http://blog.csdn.net/net_assassin/article/category/1100363


作者:net_assassin    邮箱: net_assassin@hotmail.com    期待着与志同道合的朋友们相互交流

到目前为止,我们一直是使用单一的位图图像来创建、操纵及绘制精灵。这对于学习精灵编程是良好的起点,但其还不够有效率。例如,如果要使用这种技术来做动画,那么游戏就必须保存多个纹理(一帧一个),这样既慢又乏味。在单一的平铺了图片单元的位图图像中编排动画的各个帧,这种处理动画的方式要好得多。

使用精灵表

精灵表,就是一个包含了多个图片单元的平铺的图像。
我们需要做的就是,算出图片单元的左上角在位图图像中为止,然后从图像中按照精灵的宽度和高度复制出一个源矩形来。
left = (current frame %number of columns)*sprite width
top= (current frame / number of columns)*sprite height
使用这个技术绘制单个帧,我们可以编写一个能绘制精灵表中任何一帧的函数!为了让这个函数尽可能可重用,必须将能描述精灵的所有属性传递进来。
void Sprite_Draw_Frame(LPDIRECT3DTEXTURE9 texture, int destx, int desty, int framenum, int framew, int frameh, int columns)
{
	D3DXVECTOR3 position( (float)destx, (float)desty, 0 );
	D3DCOLOR white = D3DCOLOR_XRGB(255,255,255);

	RECT rect;
 	rect.left = (framenum % columns) * framew;
	rect.top = (framenum / columns) * frameh;
	rect.right = rect.left + framew;
	rect.bottom = rect.top + frameh;

	spriteobj->Draw( texture, &rect, NULL, &position, white);
}

draw函数最后的颜色参数如果传入的是一个带alpha成分的颜色可以让精灵以alpha混合的形式淡入淡出!要想实现这一效果,D3DCOLOR_XRGB 宏替换为 D3DCOLOR_RGBA.

使用定时器

只要有创意的使用定时器,就可以设计出一个以任何其他的帧速率来显示动画的函数。GetTickCount()函数返回的毫秒数可用于计时。
void Sprite_Animate(int &frame, int startframe, int endframe, int direction, int &starttime, int delay)
{
	if ((int)GetTickCount() > starttime + delay)
	{
		starttime = GetTickCount();

		frame += direction;
		if (frame > endframe) frame = startframe;
		if (frame < startframe) frame = endframe;
	}	
}

爆炸精灵

抱歉!评论已关闭.