我试图在我的游戏中从其他玩家那里创造出平滑的动作,虽然它很流畅但是当一个人行走超过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)
我怀疑你在两台规格不同的电脑上运行这个游戏.考虑到您的移动没有考虑自上次更新以来经过的时间量,更快的处理器可能每秒执行此更新更多次,因此进一步移动.要解决此问题,您应该使用"增量时间"来使用基于时间的移动.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)
你的"速度"变量(或常数),现在是每秒速度.当在不同的机器上执行此操作时,单位将以相同的速率移动,我相信您的问题将会消失.几年前我遇到了完全相同的问题.
| 归档时间: |
|
| 查看次数: |
2064 次 |
| 最近记录: |