此为原创,转载请注明作者和出处,谢谢!
以上图片正是我们要将它变成动态的图片,Sprite sheets本文译作精灵图,表示包含若干精灵的一张大图。
您使用的SpriteBatch.Draw重载版本有一个参数(第三个)允许您指定一个源矩形,使原图只有这部分被绘制。到目前为止您都是为该参数指定null值来告诉XNA绘制整幅图像,编写这样的一个算法:
精灵图中每个单独图像(或称为帧)的宽和高(frameSize)。
• 精灵图的行与列的总数(sheetSize)。
• 将要绘制的图像在精灵图中所在行与列的索引(currentFrame)。
就现在这张精灵图而言,长与宽都为75像素,有8行6列,而且您将从第一帧开始绘制。往Game1类中添加一些成员变量来反映这些数据:
1Point frameSize = new Point(75, 75);
2Point currentFrame = new Point(0, 0);
3Point sheetSize = new Point(6, 8);
如果你对构造源矩形的逻辑有些不清楚,那么像这样想想看:用一个基于0的当前帧——意味着您初始化currentFrame为(0, 0)而不是(1, 1),换句话说,精灵图左上角的精灵索引表示为(0,0)而不是(1,1)——当前帧的左上角X坐标总是等于当前帧索引的X值(currentFrame.X)乘以当前帧的宽度。同样的,当前帧左上角的Y坐标总是等于当前帧索引的Y值(currentFrame.Y)乘以当前帧的高度。
在这里源矩形的宽度和高度值总是相同的,所以您可以使用frameSize.X和frameSize.Y代表源矩形的宽和高
1 currentFrame.X++;
2
3 if (currentFrame.X >= sheetSize.X)
4 {
5 currentFrame.X = 0; ;
6
7 currentFrame.Y++;
8
9 if (currentFrame.Y >= sheetSize.Y)
10 {
11 currentFrame.Y = 0;
12 }
13 }
这段代码所做的就是使currentFrame索引的X值增加1,然后检查这个值是否大于等于精灵图的列数,如果大于列数,就将值置零,并使索引的Y值增加1,开始绘制下一行的精灵。最后,如果Y值超过了精灵图的行数,将它置零使整个动画序列回到起点。编译并运行程序,您应该可以看到3个圆环的图像在窗口的左上角旋转这,