6

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

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

  1. 4 种情况,具体取决于塔所在的位置,具体取决于发射单位(NW、NE、SW、SE)
  2. 我需要计算当前目标和导弹来自的塔之间的距离Math.sqrt(x2, x1, y2, y1)
  3. 缩放导弹的 x 和 y。

现在我遇到的问题是如何将导弹的增量 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;
4

5 回答 5

3

如果你想要一个固定的速度,只需使用:

scale = someConstant;

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

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

基本上你会得到你想要去的方向的速度单位矢量,然后你将它与速度相乘以获得实际的速度矢量。不过,您的xBulletyBullet字段应该是浮点值(例如双精度值),而不是整数。

于 2012-07-29T21:11:28.693 回答
1

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

如何计算到目标的距离:勾股定理。x 目标 - x 塔用于它的一个长度,y 目标 - y 塔用于它的其他长度。将它们都平方,然后将它们加在一起,然后平方根您得到的数字。这就是目标的距离。虽然它需要一些其他代码才能正常工作(您可能会得到负值的长度,所以您需要再次更改为正值)

条件:如果到目标的距离小于塔的攻击范围:动作:塔射击响应:创建一个目标固定在其上的子弹

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

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

于 2013-01-24T07:08:51.753 回答
1

我不确定你的意思..道歉。无论如何,你不能做类似的事情..

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

这只是在给定步数中通过段到达目的地的简单方法

于 2012-07-29T21:08:17.673 回答
0

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

于 2012-07-29T21:10:29.050 回答
0

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

这需要有多现实?

我不是导弹专家,但我想一旦发射简单的导弹就可以用固定的方向和速度来近似。然后他们会继续朝那个方向前进,直到他们撞到什么东西、燃料用完或重力把他们拉下来。当导弹发射时,您可以存储它的方向和速度,并在每一步移动导弹适当的恒定距离(您可以使用三角公式转换为 x 和 y 坐标)。

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

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

小提示:出于多种原因,恒定速度只是一个近似值。当导弹第一次发射时,它必须加速,直到推进力等于空气阻力的阻力。此外,随着燃料的燃烧,它们实际上可能能够更快地行驶,因为它们具有相同的力但质量更小。但是对于塔防游戏来说,这种细节水平并不是必需的。恒定速度是合理的简化。

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

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

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

于 2012-07-29T21:06:10.657 回答