LibGDX在船的圆形2D图形周围设置了子弹初始位置

时间:2014-03-27 13:35:05

标签: java libgdx

对于一些想法有一个小问题,但不知道使用哪些库以及如何使用。 到目前为止,我正在创建2D游戏,我有一个小船精灵和子弹。 这一刻,我的子弹从船的中心点发射。

我想要的是什么:

  • 在我的船周围创造一个像圆圈的东西,并使之成为可能 根据方向从圆圈线射出子弹。也许 可以通过使用Quaternion类来制作,但需要一些 提示,如何开始。
  • 另一个想法是创造另一个子弹,其中 将始终与第一个平行,并将被解雇 同时进行。

下面的图片描述了我在这个项目中的目标。 enter image description here

到目前为止,我在player类中的update()方法进行了下一步操作:

    @Override
public void update() {
//When player touches the screen, TouchInputHandler class sets the variable isAiming = true.
    if (TouchInputHandler.isAiming) {
//Creating an Vector2 object which takes coordinates from user input on the screen.
        Vector2 aim = new Vector2(TouchInputHandler.getAimDirection().x, TouchInputHandler.getAimDirection().y);

//Checking if aim is real value. 
//Waiting for the delay between previous and next bullet launched.
        if (aim.len2() > 0 && cooldownRemaining <= 0) {

//cooldownFrames if final static value equal to 6. 
//So loop will go through 6 times before next bullet.
            cooldownRemaining = cooldownFrames;
//Taking the current position of the ship and applying it to the current position of bullet.
            Vector2 currentPos = new Vector2(position.x, position.y);
//Substituting current bullet position from the aim position and getting direction vector.
            aim.sub(currentPos);
 //Normalizing the aim (bullet direction) vector, so the sum of scalars of vector = 1;
        aim.nor();

          //Incresing the speed of bullet movement.
            aim.x *= 10;
            aim.y *= 10;

           //adding new entity with the bullet currentPos and direction where it has to move.
            EntityManager.addEntity(new Bullet(currentPos, aim));

//After bullet has been launched, set isAiming to false.
                  TouchInputHandler.isAiming = false;
              }
    }

//decreasing cooldown Remaining in every loop until it will be equal 0 and bullet'll be ready again.
    if (cooldownRemaining > 0)
        cooldownRemaining--;
//method that is responsible for player movement.
    motionMove();

}

如果您需要任何其他代码部分或其他信息,请询问。 我将非常感谢您的帮助或任何提示。谢谢!

1 个答案:

答案 0 :(得分:2)

您应该使用direction向量来获取起始位置。 要执行此操作,您只需使用圈子的direction缩放radius向量,并将此向量添加到圈子中心:

bulletStart.set(position).add(direction.scl(radius));

position是您船舶的中心。 direction是标准化的方向向量。 radius是圆圈半径。

请注意,Vector2的方法会更改Vector并将其返回以进行链接。因此,在致电direction.scl(radius)后,direction不再正常化。

另一个注意事项:这不是很准确(尽管我理解的很多),因为Vector的长度为vector.x + vector.y而不是sqrt(vector.x² + vector.y²),这将是半径。但是在你的情况下,差异不应该很大,我现在无法考虑正确的公式,即使它不应该那么难。如果有人知道,请告诉我:P