XNA开发2D游戏中关于精灵图片的写法

时间:2023-02-09 15:02:00

此为原创,转载请注明作者和出处,谢谢!

XNA开发2D游戏中关于精灵图片的写法

以上图片正是我们要将它变成动态的图片,Sprite sheets本文译作精灵图,表示包含若干精灵的一张大图。
您使用的SpriteBatch.Draw重载版本有一个参数(第三个)允许您指定一个源矩形,使原图只有这部分被绘制。到目前为止您都是为该参数指定null值来告诉XNA绘制整幅图像,编写这样的一个算法:

精灵图中每个单独图像(或称为帧)的宽和高(frameSize)。

 精灵图的行与列的总数(sheetSize)。

 将要绘制的图像在精灵图中所在行与列的索引(currentFrame)。

  就现在这张精灵图而言,长与宽都为75像素,有8行6列,而且您将从第一帧开始绘制。往Game1类中添加一些成员变量来反映这些数据:

1XNA开发2D游戏中关于精灵图片的写法Point frameSize = new Point(7575);
2XNA开发2D游戏中关于精灵图片的写法Point currentFrame = new Point(00);
3XNA开发2D游戏中关于精灵图片的写法Point sheetSize = new Point(68);

如果你对构造源矩形的逻辑有些不清楚,那么像这样想想看:用一个基于0的当前帧——意味着您初始化currentFrame为(0, 0)而不是(1, 1),换句话说,精灵图左上角的精灵索引表示为(0,0)而不是(1,1)——当前帧的左上角X坐标总是等于当前帧索引的X值(currentFrame.X)乘以当前帧的宽度。同样的,当前帧左上角的Y坐标总是等于当前帧索引的Y值(currentFrame.Y)乘以当前帧的高度。

在这里源矩形的宽度和高度值总是相同的,所以您可以使用frameSize.XframeSize.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个圆环的图像在窗口的左上角旋转这,