大炮在海盗船周围旋转

时间:2016-01-17 17:38:53

标签: libgdx rotation

Visual description

我有一艘海盗船,它有大炮,当船没有旋转时可以工作,但是当它在0度时停留(如预期的那样)。我需要它们在旋转时绕着海盗船的中心旋转,所以它们仍然与船上图像上的大炮一致。简而言之,我需要的是:

  1. 大炮相对于船只保持相同的旋转(如图片中所示"我想要的"
  2. 大炮移动时相对于船只保持相同的位置
  3. 大炮里面有一个名为forwardDirection的Vector2,我需要它总是指向相对于船的方向
  4. 对于位置和旋转,它应该与Unity 3D&其他游戏引擎,当你将某些内容添加到其他东西时,因为它总是与父亲相同的相对位置和轮换。
  5. 我完全不知道如何做到这一点,所以我需要帮助。这个解释也许并不清楚,所以如果有什么不合理的话,那么就对它进行评论,然后我就改变它。

1 个答案:

答案 0 :(得分:1)

假设您有10门大炮,每个大炮都作为一个对象存储在列表中。

为了方便起见,让我们说cannon1是List.get(0)(获得第一门大炮)

float newX = calculateDistanceX(ship.velocity, cannon1.currentAngle) + cannon1.xPosition;

float newY = calculateDistanceY(ship.velocity, cannon1.currentAngle) + cannon1.yPosition;

cannon1.setX(newX);

cannon1.setY(newY);

/**
 * Calculates the offset which needs to be added to the X position according
 * to the angle .
 * 
 * @param velocity
 *            The velocity
 * @param angle
 *            The angle
 * @return The offset which needs to be added
 */
protected float calculateDistanceX(float velocity, float angle) {
    return velocity * MathUtils.cos(MathUtils.degreesToRadians * angle);
}

/**
 * Calculates the offset which needs to be added to the Y position according
 * to the angle.
 * 
 * @param velocity
 *            The velocity
 * @param angle
 *            The angle
 * @return The offset which needs to be added
 */
protected float calculateDistanceY(float velocity, float angle) {
    return velocity * MathUtils.sin(MathUtils.degreesToRadians * angle);
}

现在通过这种方式你可以用船移动你的大炮。当你上下移动船时,这个公式将改变你的大炮的位置。为你所有的大炮做这个,你会得到他们的位置。

可能有更好的方法可以做到这一点,但这就是我在游戏中的表现,它适用于单个大炮。

希望这能为您提供如何解决问题的基本知识。 (它的数学位,基本上是解析sin和cos分量,即基本物理)