在我的游戏中,我试图从其他玩家那里创建平滑的移动,虽然它很流畅,但当一个人走超过5-10秒左右时,它就会变得相当落后。
我知道问题所在:这是因为玩家的速度是每步X像素,它可能会不对齐。不过,我真的不知道如何修复它。现在,虚拟玩家的绘图位置以X速度移动到它从服务器接收到的点。我试图简单地使用当前点和旧点的平均值来尝试使其平滑,但这只会导致紧张的运动,几乎与什么都不做一样糟糕。
我的选择似乎只限于不准确的位置,因为后面或紧张的运动。你知道解决这个问题的可靠方法吗?谢谢。
下面是移动绘制位置的代码:
Vector2 sMove = new Vector2(Position.X - DrawPosition.X, Position.Y - DrawPosition.Y);
sMove.Normalize();
sMove = Vector2.Multiply(sMove, Math.Min(Vector2.Distance(DrawPosition, Position), Speed));
DrawPosition.X += sMove.X;
DrawPosition.Y += sMove.Y;发布于 2011-08-28 05:53:10
我怀疑你在两台不同规格的电脑上运行这款游戏。考虑到您的移动没有考虑自上次更新以来所经过的时间量,速度越快的处理器可能每秒执行此更新的次数更多,因此移动得更远。要解决这个问题,您应该使用基于时间的移动,并使用“增量时间”。XNA已经为您提供了这一点。你的代码应该看起来像这样:
protected override void Update(GameTime gameTime)
{
Vector2 sMove = new Vector2(Position.X - DrawPosition.X, Position.Y - DrawPosition.Y);
sMove.Normalize();
// START CHANGE
sMove = Vector2.Multiply(sMove, Math.Min(Vector2.Distance(DrawPosition, Position), Speed * gameTime.ElapsedGameTime.TotalSeconds));
// END CHANGE
DrawPosition.X += sMove.X;
DrawPosition.Y += sMove.Y;
}其中您的" Speed“变量(或常量)现在是速度每秒。当这在不同的机器上执行时,单元将以相同的速度移动,我相信您的问题将会消失。几年前我也遇到过同样的问题。
发布于 2011-08-28 06:10:44
浮点运算是不确定的,由于四舍五入或硬件差异,解决此问题的最佳方法是使用定点数学。
http://paulbergeron.posterous.com/fixed-point-math-in-c
https://stackoverflow.com/questions/7217215
复制相似问题