Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 小行星libGDX余弦和正弦旋转方程,以错误的角度发射子弹_Java_Libgdx_Trigonometry - Fatal编程技术网

Java 小行星libGDX余弦和正弦旋转方程,以错误的角度发射子弹

Java 小行星libGDX余弦和正弦旋转方程,以错误的角度发射子弹,java,libgdx,trigonometry,Java,Libgdx,Trigonometry,我为安卓设备制作了一个小行星游戏,但很难注意到玩家站在一个方向,但朝另一个稍微移位的方向开枪。我浏览了代码,它只发生在玩家加速和旋转时。当玩家只是旋转时就不会了。我希望这段代码足以告诉您一些关于它的信息,给我一个建议 球员在正确的方向旋转,而子弹没有。我试着把更新函数按不同的顺序排列,但这也没用。我看不出问题是什么,因为在射击玩家时,每次都会用玩家的弧度制造子弹。所以我认为这与子弹发射时弧度没有更新有关 private void initForces() { maxSpeed = 300

我为安卓设备制作了一个小行星游戏,但很难注意到玩家站在一个方向,但朝另一个稍微移位的方向开枪。我浏览了代码,它只发生在玩家加速和旋转时。当玩家只是旋转时就不会了。我希望这段代码足以告诉您一些关于它的信息,给我一个建议

球员在正确的方向旋转,而子弹没有。我试着把更新函数按不同的顺序排列,但这也没用。我看不出问题是什么,因为在射击玩家时,每次都会用玩家的弧度制造子弹。所以我认为这与子弹发射时弧度没有更新有关

private void initForces() {
    maxSpeed = 300;
    acceleration = 200;
    friction = 10;
}

private void initRotationSpeed() {
    // Radians are used to determine the angle the player points in
    radians = MathUtils.PI / 2;

    rotationSpeed = 3;
}

public void shoot() {
    final int MAX_BULLETS = 4;
    if (bullets.size() == MAX_BULLETS || isHit()) return;
    bullets.add(new Bullet(x, y, radians));
}

   public void update(float dt) {
        if (updateCheckIfPlayerHit(dt)) {
            return;
        }

        updateCheckExtraLives();

        // Forces
        updateAcceleration(dt);
        updateRotationSpeed(dt);
        updateTurning(dt);
        updateFriction(dt);

        // Set shape
        setShape();

        // Screen wrap
        wrap();
    }

   private void updateTurning(float dt) {
        // Turning: Tilt the screen to left or right to rotate the ship
        final float ROTATION_SENSITIVITY = 3;
        if (left || Gdx.input.getAccelerometerX() > ROTATION_SENSITIVITY) {
            radians += rotationSpeed * dt;
        }
        else if (right || Gdx.input.getAccelerometerX() < -ROTATION_SENSITIVITY) {
            radians -= rotationSpeed * dt;
        }
    }

    private void updateRotationSpeed(float dt) {
        x += dx * dt;
        y += dy * dt;
    }

    private void updateAcceleration(float dt) {
        // Accelerating
        if (up || Gdx.input.isTouched() && Gdx.input.getX() > 0 && Gdx.input.getX() < Gdx.graphics.getWidth() / 2) {
            dx += MathUtils.cos(radians) * acceleration * dt;
            dy += MathUtils.sin(radians) * acceleration * dt;
        }
    }

    private void updateFriction(float dt) {
        // Friction
        float vector = (float)Math.sqrt(dx * dx + dy * dy);
        if (vector > 0) {
            dx -= (dx / vector) * friction * dt;
            dy -= (dy / vector) * friction * dt;
        }

        if (vector > maxSpeed) {
            dx = (dx / vector) * maxSpeed;
            dy = (dy / vector) * maxSpeed;
        }
    }
和玩家一起射击的代码是:

    if (Gdx.input.justTouched() &&
                    Gdx.input.getX() > Gdx.graphics.getWidth() / 2 &&
                    Gdx.input.getX() < Gdx.graphics.getWidth()) {
        player.shoot();
    }
if(Gdx.input.justTouched()&&
Gdx.input.getX()>Gdx.graphics.getWidth()/2&&
Gdx.input.getX()
我问题的答案是我忘了一点数学。所以在Bullet构造函数中,我没有播放器在x或y方向的速度,所以我在播放器类中创建了两个静态变量,并在更新旋转速度函数中将它们设置为等于播放器的dx和dy。这两个变量都是浮点数

private void updateRotationSpeed(float dt) {
    x += dx * dt;
    y += dy * dt;

    dxStatic = dx;
    dyStatic = dy;
}

public static float getPlayerDeltaX() {
    return dxStatic;
}

public static float getPlayerDeltaY() {
    return dyStatic;
}
在Bullet类的构造函数中,我需要添加以下内容:

Bullet(float x, float y, float radians) {
    this.x = x;
    this.y = y;
    this.radians = radians;

    float speed = 350;
    dx = speed * MathUtils.cos(radians) + Player.getPlayerDeltaX();
    dy = speed * MathUtils.sin(radians) + Player.getPlayerDeltaY();

    width = height = 2;

    lifeTimer = 0;
    lifeTime = 1;
}
这就是导致子弹向稍微不同的方向移动的原因

编辑: 或者您可以只向Bullet构造函数添加一些浮点变量,并接受播放器的dx和dy,因为每次在播放器类中都会创建一个Bullet。就我而言,至少是这样。这可能是一个更好的选择

Bullet(float x, float y, float playerDeltaX, float playerDeltaY, float radians) {
    this.x = x;
    this.y = y;
    this.radians = radians;

    float speed = 350;
    dx = speed * MathUtils.cos(radians) + playerDeltaX;
    dy = speed * MathUtils.sin(radians) + playerDeltaY;

    width = height = 2;

    lifeTimer = 0;
    lifeTime = 1;

}

是否每个玩家都以相同的速度移动(即以相同的方向和幅度)?我想不是。这意味着变量不应该是静态的。相反,您应该为这些值实现适当的setter和getter。只有一个播放器,但我已经更改了,以便Bullet构造函数接受播放器的dx和dy(速度)。这不是和实现setter和getter几乎一样吗?(这显示在我答案的编辑部分)我的主要观点是,这是对
static
的不当使用。它不用于将数据共享给其他类的实例。相反,当一个类的所有实例对一个变量都有相同的值时,可以使用它。感谢您让我更好地了解如何编写代码:)
Bullet(float x, float y, float playerDeltaX, float playerDeltaY, float radians) {
    this.x = x;
    this.y = y;
    this.radians = radians;

    float speed = 350;
    dx = speed * MathUtils.cos(radians) + playerDeltaX;
    dy = speed * MathUtils.sin(radians) + playerDeltaY;

    width = height = 2;

    lifeTimer = 0;
    lifeTime = 1;

}