【问题标题】:Let an Enemy follow a path with the same speed让敌人以相同的速度跟随路径
【发布时间】:2014-01-21 11:38:02
【问题描述】:

我开始用 Java 编写游戏。我有 Enemys and a Player,一个基本的 2D 游戏,这是第一次获得经验。

现在我希望敌人遵循一条路径,我可以将其绘制到“关卡编辑器”中。 我有一个 JPanel,一个 mouseMoveListener,点击 Path2D 开始将 mouseMove 点保存到 Path2D.Double 对象。

之后,我实现了以下方法让敌人沿着这条路走:

public void forward(){
    if(!pathIterator.isDone()){
        pathIterator.currentSegment(current);
        x = current[0];
        y = current[1];
        pathIterator.next();
    }
    else {
        dead = true;
    }
}

我认为现在发生的事情很清楚:敌人正在跟随,但速度是我移动鼠标的速度。因此,如果我快速移动到鼠标,敌人就会......从一个点“跳”到另一个点。放慢速度,它“偷偷摸摸”地越过这些点。 (而且因为我不是机器人,所以我不能以相同的速度移动鼠标^^)

谈到机器人:是的,我可以让 awt.Robot 移动我的鼠标。但这也不太可能,因为我必须绘制复杂的路径,这些路径背后没有任何可见的数学。

所以,我想让这个敌人以同样的速度在这条路上前进。我的问题:我不知道在哪里实施“修复”。我有 2 个想法:

  • 也许我可以创建路径:不只是将点添加到 Path2D,也许我可以计算我快速移动的点之间的点,或者删除彼此靠近的点。但是:首先,我不知道如何计算,(有什么数学逻辑可以实现这个吗?)其次,当我这样做时,我可能无法改变游戏中敌人的速度,而且会很糟糕

  • 我的第二个想法是计算之间的点(或要跳过的点),这应该发生在每一帧,相对于实际速度。但是这里我的数学经验不够。

那么,这是否可行,如果可以,有人知道如何计算吗? 如果没有,我还有什么其他的可能性来实现这一目标?

谢谢你,抱歉英语不好!

【问题讨论】:

  • 您总是可以考虑使用 Splines,这意味着您在应用程序中生成一组控制点来创建路径,您可以在游戏中使用这些控制点。然而,在我看来,这是一个相当困难的主题,所以我不确定你现在是否应该接受它。
  • 我当时也是这么想的 ^^ 谢谢你的想法,但 Tim B 已经命名了解决方案。还是谢谢你!

标签: java performance game-physics path-2d


【解决方案1】:

你需要做的就是在敌人类中定义敌人的移动速度。

当它计算出下一个要移动的点时,然后通过从新位置中减去当前位置来创建一个方向向量。

将方向向量标准化(因此它的长度为 1),然后将其乘以速度和 tpf(每帧时间)。

移动那个量而不是跳到下一个点。

(请注意,如果点非常靠近或帧速率较低,这可能会导致它有点过冲,但应该没问题。

【讨论】:

  • Arghhh,数学:D 谢谢你的回答!所以,方向向量是 [x](xCurrent|xNew)[y](yCurrent|yNew),对吗?我将谷歌如何规范化它^^
  • (xNew-xCurret), (yNew-yCurrent) - 长度为sqrt(x*x+y*y)。标准化是x/length, y/length。 :)
  • 你的库可能有一个 Vector2f (或类似的)类型用于存储向量,并且很可能有一些描述的 normalize() 方法。
  • 我没有使用任何库。我只是使用默认的 jre :) 等等 - 所以这个向量的长度是 sqrt x² + y² 吗?然后除点/长度?
  • 如果您接近路径的尽头,只需“捕捉”到最终位置并退出。最简单的方法是查看到终点的距离是否
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多