zoukankan      html  css  js  c++  java
  • XNA开发2D游戏中关于精灵图片的写法

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

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

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

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

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

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

    1Point frameSize = new Point(7575);
    2Point currentFrame = new Point(00);
    3Point 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个圆环的图像在窗口的左上角旋转这,

  • 相关阅读:
    147
    UVA12230 过河 Crossing Rivers
    重聚
    网络流24题 P2762 太空飞行计划问题
    网络流24题 P2756 飞行员配对方案问题
    网络流24题
    洛谷 P3369 【模板】普通平衡树
    LOJ #6280. 数列分块入门 4
    LOJ #6279. 数列分块入门 3
    LOJ #6278. 数列分块入门 2
  • 原文地址:https://www.cnblogs.com/315358525/p/1503116.html
Copyright © 2011-2022 走看看