2D XNA游戏中的动画的制作过程很像卡通手翻书。动画制作包含着大量的独立图像,通过在一个周期内图像间的快速切换来使它们显示为动画。通常精灵动画存放在图片文件中,您需要用某种顺序把图片上独立的图像提取出来,然后绘制在屏幕上。本书把这些图片文件称为“精灵位图(Sprite Sheet)”。
现在您已经将精灵位图加载到Texture2D对象中,可以开始考虑如何在精灵位图上轮流获得独立的精灵帧了。为了编写这样的一个算法,您需要了解以下信息:
• 精灵位图中每个单独图像(或称为帧)的宽和高(frameSize)。
• 精灵位图的行与列的总数(sheetSize)。
• 指示接下来精灵位图中将要绘制的精灵帧在精灵位图中所处的行与列的位置的索引(currentFrame)。
Point frameSize = new Point(75, 75); Point currentFrame = new Point(0, 0); Point sheetSize = new Point(6, 8);
对于这几个变量,Point结构体都可以工作得很好,因为它们都需要一种能表示2D坐标(X和Y位置)的数据类型。
现在您可以添加SpriteBatch.Draw调用了。您将使用与之前几个例子中相似的版本,唯一的不同点是:不再向源矩阵传递null值,而是为第三个参数传递一个基于currentFrame和frameSize的源矩形。以下代码可以实现这一点,将它们添加到Game1类的Draw方法中,位于base.Draw之前:
1 spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.AlphaBlend); 2 spriteBatch.Draw(texture, Vector2.Zero, 3 new Rectangle(currentFrame.X * frameSize.X, 4 currentFrame.Y * frameSize.Y, 5 frameSize.X, 6 frameSize.Y), 7 Color.White, 0, Vector2.Zero, 8 1, SpriteEffects.None, 0); 9 10 spriteBatch.End();