我试图在游戏中为其他玩家创建平滑的移动,虽然很平滑,但当一个人行走超过 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;
最佳答案
我怀疑您正在两台不同规范的计算机上运行此游戏。考虑到您的移动没有考虑自上次更新以来已经过去的时间量,更快的处理器可能每秒执行此更新的次数更多,因此会移动得更远。要解决此问题,您应该使用“增量时间”来进行基于时间的移动。 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;
}
您的“速度”变量(或常量)现在是每秒速度。当在不同的机器上执行此操作时,单元将以相同的速率移动,我相信您的问题将会消失。几年前我也遇到过同样的问题。
关于c# - 流畅的多人游戏 Action ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7217215/