2013-03-05 55 views
0

我目前正在编程一个塔防,导弹往往会错过敌人,而不是像他们在桌面塔防中那样跟着/击中他们。这是因为他们在没有给敌人任何领先的情况下射击,所以当敌人到达敌人位置时,敌人已经离开3-5个像素。我查了一下如何解决这个问题,发现我需要使用向量数学来解决问题。例如,这个网站http://www.helixsoft.nl/articles/circle/sincos.htm有一些如何编写自导导弹的代码,但我不确定这是否是我需要解决我的问题的那种数学。如何正确编程导弹寻路?

看起来像是在stackoverflow上的帖子推荐一些叫做“命令指导”的东西,但不知道如何与2D游戏一起工作。

所以目前,我很困惑,该怎么做。任何方向/指导将不胜感激。

回答

1

这听起来像你已经有了代码,如果它们是静止的,它们会正确地击中敌人,并且只有在导弹在飞行中它们移动的事实是问题。

为什么不在每当敌人迈出一步,或每隔10个像素左右导弹移动时,简单地将导弹从其当前位置“重新启动”到敌人的新位置。

这将导致导弹对敌方飞行进行“归位”,而不是预测导弹到达时敌人的位置。

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

1

该文章正是你所需要的,阅读导弹回归部分,并使用反正切函数。

+0

我不明白该函数如何增加导弹的x和y位置。 x + =长度* fcos(角度)和y + =长度* fsin(角度)如何增加x位置和y位置?对我来说没有多大意义。基本上,我需要导弹位置来增加每个刻度,而我只是不确定长度* fsin(角度)= y的移动距离和长度* fcost(角度)= x的移动距离。 – GayLord 2013-03-05 22:54:18

+0

我真的很推荐阅读整篇文章和实例 - 这些问题和解决方案在游戏开发中一次又一次地出现。 – 2013-03-05 23:20:29

+0

简而言之,cos(角度)返回敌人在x方向上的距离,sin(角度)返回敌人在y方向上的距离。 cos(角度)和sin(角度)都返回范围[0,1]中的值,因此需要乘以速度。 – 2013-03-05 23:22:23

1

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

比方说,你的塔是在点(0,0),你收集你的目标的两点看法:在t=1

  • (100,100)t=0
  • (90,95)

速度:首先计算这两个点之间的距离:

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 

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