c# - 流畅的多人游戏 Action

标签 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;

最佳答案

我怀疑您正在两台不同规范的计算机上运行此游戏。考虑到您的移动没有​​考虑自上次更新以来已经过去的时间量,更快的处理器可能每秒执行此更新的次数更多,因此会移动得更远。要解决此问题,您应该使用“增量时间”来进行基于时间的移动。 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/

相关文章:

c# - 检查数据库中的新行 - 具有轮询或 SQL 依赖性?

c# - Expression.Coalesce 的转换参数是做什么用的?

c# - 为什么我的 TreeView 仅显示一层深度?

c# - 获取 3D 模型特定顶点可见时的屏幕空间坐标

c# - 使用C#增大或减小音频文件的音高

c# - .Net Release 构建工作速度比 Debug 慢

c# - LINQ to SQL 在 DataContext Dispose 之后使用查询

directx - XNA 目标受众

c# - XNA(C#) 中的 Vector2.Transform() 和 Vector2.TransformNormal() 有什么区别

c# - 具有任意缩放中心的 XNA 2d 相机