Java 如何正确编程导弹寻径?

Java 如何正确编程导弹寻径?,java,Java,我目前正在规划一个塔防,导弹往往会错过敌人,而不是像桌面塔防那样跟踪/打击敌人。这是因为他们在没有给敌人任何线索的情况下射击,所以当它到达敌人的位置时,敌人已经有3-5像素的距离了。我查看了如何解决这个问题,发现我需要使用向量数学来解决这个问题。例如,这个网站有一些关于如何编程寻的导弹的代码,但我不确定这是否是我解决问题所需要的数学 看起来stackoverflow上的帖子推荐了一种叫做“命令引导”的东西,但不知道如何在2d游戏中使用它 所以现在,我很困惑该怎么办。任何方向/制导都将不胜感激。这

我目前正在规划一个塔防,导弹往往会错过敌人,而不是像桌面塔防那样跟踪/打击敌人。这是因为他们在没有给敌人任何线索的情况下射击,所以当它到达敌人的位置时,敌人已经有3-5像素的距离了。我查看了如何解决这个问题,发现我需要使用向量数学来解决这个问题。例如,这个网站有一些关于如何编程寻的导弹的代码,但我不确定这是否是我解决问题所需要的数学

看起来stackoverflow上的帖子推荐了一种叫做“命令引导”的东西,但不知道如何在2d游戏中使用它


所以现在,我很困惑该怎么办。任何方向/制导都将不胜感激。

这篇文章正是您所需要的,请阅读关于寻的导弹的部分,并使用反切线函数。

这篇文章正是您所需要的,阅读关于寻的导弹的部分,只需使用反切线函数。

听起来你已经有了在敌人静止时能够正确击中敌人的代码,只有当导弹飞行时,敌人移动才是问题所在

你为什么不干脆在敌人迈出一步时,或者每隔10个像素左右导弹移动一次,从当前位置向敌人的新位置“重新发射”导弹呢

这将导致导弹“瞄准”飞行中的敌人,而不是在导弹到达时预测敌人的位置


不同之处在于,“寻的”每次都会导致命中,而预测方法则允许敌人在导弹飞行时通过切换行走方向来躲避导弹。你更喜欢哪一个是设计决定,但我认为通常的塔防游戏使用归巢方法。

听起来你已经有了代码,如果敌人静止不动,就可以正确击中他们,而问题只在于他们在导弹飞行时移动

你为什么不干脆在敌人迈出一步时,或者每隔10个像素左右导弹移动一次,从当前位置向敌人的新位置“重新发射”导弹呢

这将导致导弹“瞄准”飞行中的敌人,而不是在导弹到达时预测敌人的位置

不同之处在于,“寻的”每次都会导致命中,而预测方法则允许敌人在导弹飞行时通过切换行走方向来躲避导弹。你喜欢哪一个是设计决定,但我认为通常的塔防游戏使用归巢方法。

你需要“预测”敌人的方向。假设它沿着直线移动,塔需要观察目标的速度和方向

假设你的塔位于点(0,0)处,你收集了对目标的两个观察结果:

 y - y1 = m * (x - x1)
 ==> y = 0.5 * (x - 100) + 100 =
       = 0.5 * x + 50
  • (100100)at
    t=0
  • (90,95)在
    t=1时
速度:首先计算这两点之间的距离:

 d = sqrt((x2-x1)^2 + (y2 - y1)^2) =
   = sqrt(10^2 + 5^2) = sqrt(125) = 11.18034
因此,目标的速度是11.18034(因为你在相当于一个时间单位的间隔内进行了观测)

角度:一点几何图形。轨迹的斜率为:

 m = (y2 - y1) / (x2 - x1) =
   = 5 / 10 = 0.5
所以角度是:

 theta = arctan(0.5) = 0.463648 radians (or 26.56 degrees)
使用两点和坡度,可以估计目标的轨迹:

 y - y1 = m * (x - x1)
 ==> y = 0.5 * (x - 100) + 100 =
       = 0.5 * x + 50
剩下的就是计算导弹可以拦截目标的点。为此,你需要知道你的导弹的速度,然后计算“最佳”拦截点。我把这第二步留给你。这是简单的几何学(还有一点创造力)

你需要“预测”敌人的方向。假设它沿着直线移动,塔需要观察目标的速度和方向

假设你的塔位于点(0,0)处,你收集了对目标的两个观察结果:

 y - y1 = m * (x - x1)
 ==> y = 0.5 * (x - 100) + 100 =
       = 0.5 * x + 50
  • (100100)at
    t=0
  • (90,95)在
    t=1时
速度:首先计算这两点之间的距离:

 d = sqrt((x2-x1)^2 + (y2 - y1)^2) =
   = sqrt(10^2 + 5^2) = sqrt(125) = 11.18034
因此,目标的速度是11.18034(因为你在相当于一个时间单位的间隔内进行了观测)

角度:一点几何图形。轨迹的斜率为:

 m = (y2 - y1) / (x2 - x1) =
   = 5 / 10 = 0.5
所以角度是:

 theta = arctan(0.5) = 0.463648 radians (or 26.56 degrees)
使用两点和坡度,可以估计目标的轨迹:

 y - y1 = m * (x - x1)
 ==> y = 0.5 * (x - 100) + 100 =
       = 0.5 * x + 50

剩下的就是计算导弹可以拦截目标的点。为此,你需要知道你的导弹的速度,然后计算“最佳”拦截点。我把这第二步留给你。这是一个简单的几何图形(还有一点创意)

我不明白这个函数如何增加导弹的x和y位置。x+=长度*fcos(角度)和y+=长度*fsin(角度)如何增加x位置和y位置?对我来说没什么意义。基本上,我需要导弹的位置来增加每一个刻度,我只是不确定长度fsin(角度)=移动y和长度fcost(角度)的距离=移动为x移动。我真的建议通读整篇文章并使用示例——这些问题和解决方案在游戏开发中反复出现。简单地说,cos(角度)返回敌人在x方向的距离,sin(角度)返回敌人在y方向的距离。cos(angle)和sin(angle)都返回[0,1]范围内的值,因此需要乘以速度。但我不明白该函数如何增加导弹的x和y位置。x+=长度*fcos(角度)和y+=长度*fsin(角度)如何增加x位置和y位置