我正和一些Java朋友一起建立一个小塔防御游戏。现在我被分配了塔的逻辑,目前我正在试图弄清楚塔必须如何转向瞄准并击中目标怪物。因为怪物在塔转弯和射击时继续前进,所以它需要瞄准未来的位置。我已经实现了一个函数,它给了我任何时间t的怪物位置以及一个函数,它给了我转向怪物所需的较小角度,但现在我很困惑因为有三个未知变量:
所以我正在寻找一个解决方案:
min(t1+t2) = min(t3)
目标怪物仍然在塔的范围内。我已经考虑过使用最大需要转弯和最大可能范围进行计算,然后逐步递减,但我很好奇是否存在“完美”的非启发式解决方案?
答案 0 :(得分:4)
对于每个坐标,我们可以计算 t B 的时间,我们需要在该位置放置一颗子弹。这是转弯时间加上子弹需要的时间( t 1 + t 2 )。
我们可以击中怪物的最早时间是怪物(预测)路径上的第一个位置,怪物和子弹会在这里进行致命的会面。
我从怪物的位置开始,计算野兽的时间和位置,并计算子弹是否会提前或晚到。
你可以消除其中一个变量,如果你只是转动并检查每个度数,或者如果你可以杀死怪物,如果你现在 。你将只有两个向量(瞄准,怪物移动方向)和一个交叉点,只需要测试,如果怪物和子弹同时在那里相遇(距离交叉点,速度)。
答案 1 :(得分:3)
添加信息:
我认为给定的怪物与塔的距离为D,在通向塔的最短路径上移动,塔开始转向怪物。这是t=0
的情况。
固定类型:
如果你的塔以角速度omega
转弯,也就是说phi
时的角度t
phi = omega * t
因此,如果你知道你的塔必须转弯phi
,子弹将会被射击
t = phi/omega
从此开始,子弹速度v
已经走过的距离是
s(t) = v * (t-phi/omega)
如果你的怪物以vm
的速度移动,怪物将会移动
距离d
d(t) = D - vm * t
如果
,子弹击中了怪物s(t) = d(t)
此等式易于解决:只需替换d(t)
和s(t)
并重新排列获取t
的条款:
t = (D + v * phi/omega) / (phi/omega + vm)
此时子弹将会s(t)
移动。如果这个值为负值,那么怪物太快并且在子弹射击之前到达塔楼