【问题标题】:Smooth multiplayer movement流畅的多人运动
【发布时间】:2011-08-27 20:40:15
【问题描述】:

我试图让我的游戏中的其他玩家移动流畅,虽然它很流畅,但当一个人行走超过 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;

【问题讨论】:

    标签: c# xna


    【解决方案1】:

    我怀疑你是在两台不同规格的电脑上运行这个游戏。考虑到您的移动没有​​考虑自上次更新以来经过的时间量,较快的处理器可能每秒执行此更新的次数更多,因此移动得更远。要解决此问题,您应该使用“增量时间”来使用基于时间的移动。 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;
    }
    

    您的“速度”变量(或常数)现在是每秒速度。当这在不同的机器上执行时,单元将以相同的速度移动,我相信你的问题会消失。几年前我也遇到过同样的问题。

    【讨论】:

    • 另外,请确保您使用固定的时间步长(我忘记了 XNA 是否自动执行此操作)。否则你仍然会失去同步,电脑速度较快的玩家将能够进行电脑速度较慢的玩家无法跳跃的跳跃,反之亦然......
    • @Merlyn Morgan-Graham:XNA 默认情况下会这样做,尽管您可以禁用它
    • 太棒了 :) 那么约翰的回答就是你需要做的。
    【解决方案2】:

    浮点运算不是确定性的,由于舍入或硬件差异,解决此问题的最佳方法是使用定点数学。

    http://paulbergeron.posterous.com/fixed-point-math-in-c

    【讨论】:

    • 确实如此。虽然我认为错误不会太快累积,并且只要您偶尔同步实际位置,它应该不会有太大的视觉效果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多