恒定时间制导导弹


9

我正在用玩家和导弹制作游戏。

我想从P1向P2发射导弹。导弹应始终仅花费五秒钟即可到达P2。导弹还应该跟踪P2。如果P2移得更远,则导弹必须加快速度以满足时序约束。如果P2向左移动,则导弹必须向左移动(并同时改变速度)。如果P2靠近P1,则导弹必须减速。

这可能吗?做到这一点的最佳方法是什么?

我目前没有Vector2D类(这实际上不是游戏,但是类推效果很好),因此,如果可能的话,我想要一个不需要的解决方案。

编辑:这实际上也不是导弹。:)

谢谢!


1
(我有点害怕有人问导弹制导是否符合“这实际上不是游戏”的意思,但是……)您对导弹的轨迹形状有任何限制吗?它可以始终沿当前位置和玩家2之间的直线走吗?它的转弯半径或加速度是否有限制?是否需要避免障碍?另外,您提到Vector2D-可以安全地假设您只需要2D图像吗?您可以按部就班地完成所有矢量数学运算,但是与简单的矢量数学类相比编写起来很笨拙,因此我并不十分了解对此的偏爱。
DMGregory

您错过了一些其他信息。有约束吗?导弹是沿着一条直线移动还是我们应该关心方向,最终有多少尺寸?
liggiorgio '16

路径不应受到限制。唯一的规则是:A)“导弹”应始终朝着其目标采取步骤。B)“导弹”应该总是花5秒钟到达那里。编写Vector2D类没有问题。我只是没有方便(数学不是我最好的学科)。如果它使它更容易,我可以添加它。
彼得

最简单的方法是使用Hermite样条曲线,并套用参数值。
史蒂文·斯伦

Answers:


11

编辑令人放心。:)

好的,这是一个简单的更新循环...

假设当我们发射导弹时,我们会初始化remainingFlightTime = 5f...

void UpdateMissile(float deltaTime)
{
   remainingFlightTime -= deltaTime;

   // At the end of the trajectory, snap to target & explode.
   // The math will put us there anyway, but this saves
   // on fancy logic related to overshooting. ;)
   if(remainingFlightTime <= 0f)
   {
      myX = targetX;
      myY = targetY;
      MissileImpact();
      return;
   }

   // Compute straight-line velocity that will take us
   // to the target in exactly the time remaining.
   velocityX = (targetX - myX)/remainingFlightTime;
   velocityY = (targetY - myY)/remainingFlightTime;

   // Integrate the velocity into the position.
   myX += velocityX * deltaTime;
   myY += velocityY * deltaTime;
}

1
这种方法不会使“导弹”在飞行中途围绕其发射点旋转。+1
2016年

0

为什么不掌握位置并在目标位置更改时更新目标位置?

您可能必须看一下拖尾的工作原理,但它看起来像这样:

public position startMarker;
public float duration = 5.0f;
private float startTime;
void Launch() {
    startTime = Time.time;
}
void Update() {
    float distCovered = (Time.time - startTime) / duration;
    missile.position = Vector3.Lerp(startMarker.position, target.position, distCovered);
}

通过拖拉,您基本上是在一定时间内更改对象的位置,因此可以说您是从A到B的50%的距离,并且该对象将放置在该位置。绑扎是直接的,因此您将始终朝目标移动(在注释中根据需要)。


嗯,我的坏事……我想这就是如果您尝试在凌晨3点进行编码会发生什么。更改了解决错误的答案
user3797758 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.