我正试图在我的游戏中从其他玩家那里创造出平滑的动作,虽然它很流畅但是当你走路超过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;
答案 0 :(得分:5)
我怀疑你在两台规格不同的电脑上运行这个游戏。考虑到您的移动没有考虑自上次更新以来经过的时间量,更快的处理器可能每秒执行此更新更多次,因此进一步移动。要解决此问题,您应该使用“增量时间”来使用基于时间的移动。 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;
}
你的“速度”变量(或常数),现在是每秒速度。当在不同的机器上执行此操作时,单位将以相同的速率移动,我相信您的问题将会消失。几年前我遇到了完全相同的问题。
答案 1 :(得分:0)
由于四舍五入或硬件差异,浮点运算不具有确定性,解决此问题的最佳方法是使用定点数学。