首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流畅的多人移动

流畅的多人移动
EN

Stack Overflow用户
提问于 2011-08-28 04:40:16
回答 2查看 2.2K关注 0票数 2

在我的游戏中,我试图从其他玩家那里创建平滑的移动,虽然它很流畅,但当一个人走超过5-10秒左右时,它就会变得相当落后。

我知道问题所在:这是因为玩家的速度是每步X像素,它可能会不对齐。不过,我真的不知道如何修复它。现在,虚拟玩家的绘图位置以X速度移动到它从服务器接收到的点。我试图简单地使用当前点和旧点的平均值来尝试使其平滑,但这只会导致紧张的运动,几乎与什么都不做一样糟糕。

我的选择似乎只限于不准确的位置,因为后面或紧张的运动。你知道解决这个问题的可靠方法吗?谢谢。

下面是移动绘制位置的代码:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-28 05:53:10

我怀疑你在两台不同规格的电脑上运行这款游戏。考虑到您的移动没有考虑自上次更新以来所经过的时间量,速度越快的处理器可能每秒执行此更新的次数更多,因此移动得更远。要解决这个问题,您应该使用基于时间的移动,并使用“增量时间”。XNA已经为您提供了这一点。你的代码应该看起来像这样:

代码语言:javascript
复制
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;
}

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

票数 5
EN

Stack Overflow用户

发布于 2011-08-28 06:10:44

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7217215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档