爪哇塔防导弹计算

时间:2012-07-29 21:01:51

标签: java math 2d game-physics

我正在尝试开发一个小型的Java 2d塔防游戏,我遇到了试图计算如何做导弹的问题。经过几个小时的搜索和测试,我更加困惑。

到目前为止我所拥有的是:

  1. 根据塔在(NW,NE,SW,SE)射击的单位,取决于塔的位置4个案例
  2. 我需要使用Math.sqrt(x2, x1, y2, y1)来计算当前目标与导弹来自塔的距离。
  3. 缩放导弹的x和y。
  4. 现在我遇到的问题是如何将导弹的增量x和y缩放到目标,这看起来很逼真。数学不是我的强项,而是在这里展示。下面我展示了我对塔楼的SE象限所做的一切。

    public int distanceX, distanceY;
    public double sep, scale;
    
    if(xBullet < Screen.mobs[shotMob].x && yBullet < Screen.mobs[shotMob].y){
            distanceX = Screen.mobs[shotMob].x- xBullet;
            distanceY = Screen.mobs[shotMob].y - yBullet;
            sep = Math.sqrt( (distanceX * distanceX) + (distanceY * distanceY));
            scale = // This is the part I am confused about.
            xBullet += distanceX * scale;
            yBullet += distanceY * scale;
    

5 个答案:

答案 0 :(得分:3)

如果您想要固定速度,只需使用:

scale = someConstant;

要移动子弹,您可以使用已找到的方向向量,但必须通过除以距离来对其进行标准化:

xBullet += (distanceX / sep) * scale;
yBullet += (distanceY / sep) * scale; 

基本上你可以得到你想要的方向的速度单位矢量,然后将它乘以速度来得到实际的速度矢量。您的xBulletyBullet字段应该是浮点指针值(例如双打),而不是整数。

答案 1 :(得分:1)

我不确定明白你的观点......道歉。无论如何你不能只做像...这样的事情。

xMissile += (xTarget-xOrigin)/numberOfSteps
yMissile += (yTarget-yOrigin)/numberOfSteps

这只是一个简单的方法,可以通过给定步数中的一个段来指向目的地

答案 2 :(得分:1)

我今天要去做塔防。我已经考虑过了,这就是我从塔楼拍摄的方式等。

如何计算目标距离: 勾股定理。 x target - x塔的一个长度和y目标 - y塔的另一个长度。 Sqr他们两个,并将它们加在一起,并以你的数字为根。这是目标的不满。虽然它需要一些其他代码才能正常工作(你可能会得到负值的长度,所以你需要再次改为正值)

条件:如果目标距离小于塔的攻击范围: 行动:塔射击 响应:创建一个固定目标的项目符号

循环:比较目标和导弹之间的x和y,并相应地增加x或y。

动作:导弹x和y与目标x和y相同 响应:对目标造成伤害并移除导弹

答案 3 :(得分:0)

  

现在我遇到的问题是如何将导弹的增量x和y缩放到目标,这看起来很逼真。

这需要多么现实?

我不是导弹专家,但我猜想一旦发射简单的导弹就可以通过固定的方向和速度近似。然后他们会继续向那个方向前进,直到他们遇到什么东西,耗尽燃料,或者重力使他们失望。当导弹发射时,你可以存储它的方向和速度,并在每一步移动导弹适当的恒定距离(你可以使用trigonometric formulae转换为x和y坐标。)

double delta_distance = speed * delta_time;
double delta_x = Math.cos(angle) * delta_distance;
double delta_y = Math.sin(angle) * delta_distance;

正如评论中所指出的,您可以选择使用速度矢量而不是单独存储角度和速度。

次要注意:由于多种原因,恒定速度只是近似值。当导弹首次发射时,它必须加速,直到推进力等于空气阻力的阻力。此外,随着燃料燃烧,由于具有相同的力但质量较小,它们实际上可以更快地行进。但是这种级别的细节对于塔防游戏来说并不是必需的。恒定速度是合理的简化。

如果您的目标可能快速移动并改变方向,我认为这种算法不适合您,因为导弹经常会错过目标。

更先进的寻热导弹能够锁定目标并跟随目标。他们需要能够在目标移动时改变方向,但我猜他们可能不会调整速度。由于物理限制,它们也会受限于它们改变方向的速度,因此您可能也希望对其进行建模。否则你可以让导弹飞过一个目标,然后突然翻转并立即向相反方向飞行,而不是先减速或转弯 - 这不太现实。

复杂的导弹可能会根据当前的速度来预测目标的移动位置。他们将计算一条路径,使目标的当前轨迹与计算出的导弹轨迹相撞。如果目标的移动发生变化,则必须更新此计算。显然这有点难以实现,但请记住,你的玩家想要玩爆破怪物。如果所有导弹都不会错过目标,他们就不会有太多乐趣。因此,确保您的导弹既逼真有效的额外工作将使您的游戏更好。

答案 4 :(得分:0)

您需要一个单独的x比例和y比例。 x刻度应该是从枪到目标的水平距离除以动画之前的动画总帧数和y刻度相同但垂直距离