平滑的多人运动

paj*_*ajm 2 c# xna

我试图在我的游戏中从其他玩家那里创造出平滑的动作,虽然它很流畅但是当一个人行走超过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;
Run Code Online (Sandbox Code Playgroud)

Joh*_*ald 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;
}
Run Code Online (Sandbox Code Playgroud)

你的"速度"变量(或常数),现在是每秒速度.当在不同的机器上执行此操作时,单位将以相同的速率移动,我相信您的问题将会消失.几年前我遇到了完全相同的问题.