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个圆环的图像在窗口的左上角旋转这,

  • 相关阅读:
    模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟
    模拟赛20181031 雅礼 Wearry 养花 折射 画作
    set/priority_queue的运算符重载
    set的完整用法
    最长公共上升子序列 O(n^2)
    无向图边双联通分量 tarjan 模板
    ID 迭代加深搜索 模板 埃及分数
    树上背包DP Luogu P2014 选课
    A* 第k短路
    [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询
  • 原文地址:https://www.cnblogs.com/315358525/p/1503116.html
Copyright © 2011-2022 走看看