我试图通过重力在我的XNA 2D游戏中为2D精灵制作动画。我已经开发了一个非常基础的类来实现模拟效果。这是我的示例代码。
namespace Capture
{
class PhysX
{
static Vector2 g = new Vector2(0.0f, 10.0f);
public Vector2 pos, vel, acc, accumForce;
public float mass;
public bool USE_GRAVITY = true;
/* Constructor */
public void Engage(ref GameTime gameTime, uint maxX, uint maxY)
{
Vector2 F = Vector2.Zero;
if (USE_GRAVITY)
{
F = accumForce + mass * g;
}
acc = F / mass;//This is the Net acceleration, Using Newtons 2nd Law
vel += acc * gameTime.TotalGameTime.Seconds;// v = u + a*t
pos += vel * gameTime.TotalGameTime.Seconds;// s = u*t + 0.5*a*t*t,
pos.X %= maxX;
pos.Y %= maxY;
}
public void ApplyForce(ref Vector2 f)
{
accumForce += f;
}
}
}
我在PhysX#Engage()
方法中调用Game#Update(GameTime gt)
方法。
问题是我没有得到一个平滑的动画。这是因为这个位置很快就会变得很大。为了克服我试图取模数的问题,如Viewport.Width, Viewport.Height
代码所示,但位置坐标仍然不平滑。我该怎么办。如何使动画流畅?请帮忙。
答案 0 :(得分:3)
我认为这种情况正在发生,因为您将经过时间值视为整数。
尝试使用秒的双倍值,即使是小数部分:
flaot dt = (float)GameTime.ElapsedGameTime.TotalSeconds;
vel += acc * dt;// v = u + a*t
pos += vel * dt;// s = u*t + 0.5*a*t*t,
另外:
这是因为这个职位很快就会变得很大。
好吧,你应该保持浮点值尽可能接近[-1,+ 1]范围,否则你会得到一个松散的精度。 我的建议是: