【发布时间】:2017-09-04 07:50:01
【问题描述】:
我是一名刚开始接触 MonoGame 的初级程序员。我正在实现一些运行动画的代码,但遇到了一个我不知道如何解决的问题。这是我在 AnimationManager 类中使用的代码:
public void Update(GameTime gameTime)
{
timeElapsed += (float)gameTime.ElapsedGameTime.TotalSeconds;
if (timeElapsed > timeToUpdate)
{
timeElapsed -= timeToUpdate;
//Tried to just reset timeElapsed to zero, still doesn't work
//timeElapsed = 0;
if (frameIndex < rectangles.Count -1)
{
frameIndex++;
}
else if (isLooping)
{
frameIndex = 0;
}
}
}
问题是我以每秒 24 帧的速度制作动画,当游戏以 60 或 30 fps 运行时,每次更新代码检查是否该绘制新的动画帧时,您会得到一些剩余的帧,因为您尝试过每秒均匀绘制 24 张图像,每秒 30 帧均匀游戏帧。所以剩下的6帧。这样做的结果是,大约 6 帧动画被绘制了两次,有些被跳过,整个动画的长度增加了大约 25%。有没有办法来解决这个问题?我是否可以将此代码移动到 Draw call,然后在 60 fps 游戏中将 draw call 限制在 48 fps,因此每个动画帧将在每第二个 draw call 时绘制。如果这是一个合理的解决方案,我不知道该怎么做?
VSync 最终将如何影响这一切。即使解决了这个问题,它会不会弄乱动画帧。
编辑:忘了说这是一个 2d 游戏,手绘动画。
【问题讨论】:
-
您可能应该考虑在动画帧之间进行一些插值(线性插值可能就足够了)。这样不同的帧率应该不会成为问题(仍然存在一些问题)
-
不知道插值,总初学者.. :) 我现在正在阅读它。是否适用于二维?
-
我不确定我是否理解您对每秒 24 帧与 30 帧的解释。动画可能应该在经过一段时间后交换精灵来绘制,这就是您的更新代码似乎正在做的事情。您的解释过于深入您认为问题可能是什么,而不是问题是什么。也许您可以改写问题并更笼统地解释实际和期望的行为是什么?
-
插值可以应用于任何具有不同值的东西,无论是图像、动画 (2d/3d)、模型、数字……它的用途之一是计算 2 个不同值之间的值“步骤”(例如:平滑过渡)。下面的答案绝对是一个更简单的解决方案,但插值也允许使用一些更高级的技术(例如:在两个不同的动画之间创建平滑过渡) - 您需要评估您对特定情况的需求