XNA 减速动画

Posted

技术标签:

【中文标题】XNA 减速动画【英文标题】:XNA Slow down Animation 【发布时间】:2013-03-13 17:55:32 【问题描述】:

我正在让角色奔跑,但动画速度非常快:

_frameIndex++;

_frameIndex; 是指向 SpriteSheet 中图像的值。有谁知道我如何使用gameTime.ElapsedGameTime.TotalMilliseconds 来减慢动画速度?

【问题讨论】:

【参考方案1】:

我看到你今晚问了几个关于动画和精灵表的问题,所以这里有一个来自 Aaron Reed 的“Learning XNA 4.0”的示例,来自第 3 章的“调整动画速度”标题。

首先,创建两个类级变量来跟踪动画帧之间的时间:

int timeSinceLastFrame = 0;
int millisecondsPerFrame = 50;

第一个变量跟踪动画帧更改后经过的时间,第二个变量是您指定在再次移动帧索引之前等待的任意时间。所以把millisecondsPerFrame变小会提高动画速度,把millisecondsPerFrame变大会降低动画速度。

现在,在您的更新方法中,您可以利用game.ElapsedGameTime 来检查自上次帧更改以来经过的时间,并在该值大于毫秒每帧时更改帧,您就可以工作了:

timeSinceLastFrame += gameTime.ElapsedGameTime.Milliseconds;
if (timeSinceLastFrame > millisecondsPerFrame)
    timeSinceLastFrame -= millisecondsPerFrame;
    // Increment Current Frame here (See link for implementation)

这种解决方案类似于您发现的工作,除了您可以采取额外的步骤来指定您希望动画更新的确切频率,甚至可以稍后更改该持续时间如果您愿意,请在您的代码中打开。例如,如果有一些条件会“加速”精灵(如上电)或同样减慢它,您可以通过更改 millisecondsPerFrame 来实现。

我删除了实际更新当前帧的代码,因为你应该已经有了一些可以做到这一点的东西,因为你有一个工作动画。如果您想查看完整的示例,可以从教科书的网站下载。

【讨论】:

嗨 Anthony - 非常感谢您的回答。代码对我来说还没有意义,我只需要阅读它几次,希望它会深入人心。这听起来很有希望,一旦我完全理解,我会把它放在我的代码中! 安东尼,为什么不直接使用timeSinceLastFrame = 0; 而不是timeSinceLastFrame -= millisecondsPerFrame; 一致性,主要是,但两者都行。重申凯文的评论,注意不要假设帧速率永远不会改变。 您能否详细说明“一致性”以及为什么您更喜欢将其重新分配为 0?我只是想知道你的方式可能比我的好得多。【参考方案2】:

我调试了代码,发现gameTime.ElapsedGameTime.TotalMilliseconds 总是等于 33。所以我做了以下操作:

milliSeconds += gameTime.ElapsedGameTime.Milliseconds; if (milliSeconds > 99) _frameIndex++; milliSeconds = 0;

这基本上意味着如果这是游戏的第三帧,那么让他的_frameIndex上升。重置毫秒以重新开始。

【讨论】:

我阅读您的代码的方式是,“仅每 0.099 秒或更慢更新一次动画”,这对我来说很有意义。不过,我会小心不要假设帧速率永远不会改变。不同人的机器会有不同的表现,他们同时运行的其他程序也会有所不同。

以上是关于XNA 减速动画的主要内容,如果未能解决你的问题,请参考以下文章

精灵表动画上的像素完美碰撞,XNA

如何以编程方式使用 xna 为 fbx 模型设置动画

添加到 XNA 时 Fbx 动画模型变形

C# XNA - 如何使用 2 个矩形变量绘制动画纹理?

渐变动画 - 减速和加速

让View具有减速效果的动画——FlingAnimation