【问题标题】:XNA - frequence of refreshing Draw/UpdateXNA - 刷新绘制/更新的频率
【发布时间】:2014-02-27 15:26:15
【问题描述】:

我是 XNA 编程的新手,所以肯定会遇到问题。

我的问题是:当我的玩家用枪射击子弹时,我会像这样计算它的位置变化(在我的 void Update() 中):

Position.X += (float)Math.Cos(Angle) * Multiplier;
Position.Y += (float)Math.Sin(Angle) * Multiplier;

我认为这很明显。我对任何方向、角度等都没有问题。我只是好奇如何更频繁地刷新Update。我认为我的 Multiplier 应该等于 1 以使我的子弹移动顺畅。如果我将乘数设置为(例如)50,我的子弹是“跳跃的”——每 50 * Cos/Sin 像素跳过一次。当我的子弹像那样“跳跃”时,许多位于子弹两个计算位置之间的物体将避免碰撞。将我的 Multiplier 设置为“1”会非常慢。

如何改进这个东西?有必要还是我错了?

【问题讨论】:

  • 你的意思是增加你的角度?我的意思是,乘数只是使距离变大,而不是步数。

标签: c# xna draw


【解决方案1】:

假设您使用 Game.IsFixedTimeStep = true,您可以使用 Game.TargetElapsedTime Property 更改 FixedTimeStep,但这可能不会加快您的速度,因此您需要将 Multiplier > 1 然后处理高速丢失碰撞的可能性。

人们以各种方式解决这个问题,例如从物体投射光线并在移动物体之前检测这些路径的交叉点。这是一个有趣的问题,经常出现。忘记时间步长,将乘数保持在合适的值以获得所需的速度,但在 StackOverflow/网络上搜索快速移动/小物体碰撞检测。

【讨论】:

    【解决方案2】:

    您的更新方法应如下所示:

    void Update(GameTime gameTime)
    {
        Position.X += (float)Math.Cos(Angle) * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
        Position.Y += (float)Math.Sin(Angle) * (float)gameTime.ElapsedGameTime.TotalMilliseconds;
    }
    

    您必须使用 ElapsedGameTime 在不同的计算机上存档相同的游戏速度。如果不使用 elapsedGameTime,您的游戏可以在高端计算机上运行得非常快,因为 cpu 有更多的能力来调用更新方法。 (单位在高端计算机上的跑动和射击(或他们应该做的任何事情)快速)

    您还必须使用 gameTime 来创建可玩的多人游戏。

    您不应该触摸 FixedTimeStep!

    - 尽可能频繁地调用 XNA 更新方法(取决于您的硬件...在 FixedTimeStep = true 的情况下每秒最多 60 次)!!

    (float)gameTime.ElapsedGameTime.TotalMilliseconds - 这应该返回大约 16.667

    如果这太多了,您必须减小变量“Angle”的值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多