使子弹穿过屏幕的两侧

时间:2016-04-15 15:30:42

标签: java libgdx

因此,对于编码任务,我们必须进行坦克游戏。我用这个创建了一个子弹类:

package com.MyName.battletanks;

import com.badlogic.gdx.graphics.g2d.Sprite;

public class Bullet {
    public Sprite b;
public float vx = 0;
public float vy = 0;

public Bullet(Sprite temp) { b = temp;}

public void move() { b.translate(vx*3,vy*3);}

}

我的变量如下:

Sprite Player1;
Sprite Player2;
ArrayList<Bullet> bullets;

点击空格后,它会使用以下内容创建项目符号:

if (Gdx.input.isKeyPressed(Input.Keys.SPACE)) {
        Bullet bullet = new Bullet(new Sprite(new Texture("Bullet1.png")));
        bullet.b.setPosition(Player1.getX() + Player1.getWidth() / 2, Player1.getY() + Player1.getHeight() / 2);
        float rotation = (float) Math.toRadians(Player1.getRotation());
        bullet.vx = (float) Math.cos(rotation);
        bullet.vy = (float) Math.sin(rotation);
        bullets.add(bullet);
    }

现在,我的代码是让我的坦克从屏幕的一侧穿过另一侧:

if (Player1.getX() > Gdx.graphics.getWidth()){
        Player1.setX(-64f);
    } else if(Player1.getX()<-64f){
        Player1.setX(Gdx.graphics.getWidth());
    }
    if (Player1.getY() > Gdx.graphics.getHeight()){
        Player1.setY(-64);
    } else if(Player1.getY() < -64f){
        Player1.setY(Gdx.graphics.getHeight());
    }

现在,玩家1是精灵,然而,子弹是使用arraylist和自制的子弹类创建的。因此,我不能使用我为子弹做的Player1的代码。所以,我的问题是,如何让我的子弹传递到屏幕的另一侧?

3 个答案:

答案 0 :(得分:1)

您可以使用模%运算符执行以下操作:

bullet.position.x %= Gdx.graphics.getWidth();
bullet.position.y %= Gdx.graphics.getHeight();

这未经过测试但应该可行。另外,我注意到你的速度使用2个浮点数,你应该使用Vector2,因为这样你就可以轻松地对其进行缩放和标准化,这对速度很有用。

答案 1 :(得分:0)

Player类和Bullet类实际上是一样的,因为你有相同的屏幕空间,因此你可以通过将它变成一个带有任何功能的函数来重用你当前的代码精灵。该功能定义如下:

void fitOnScreen(Sprite sprite) {
    if (sprite.getX() > Gdx.graphics.getWidth()){
        sprite.setX(-64f);
    } else if(sprite.getX()<-64f){
        sprite.setX(Gdx.graphics.getWidth());
    }
    if (sprite.getY() > Gdx.graphics.getHeight()){
        sprite.setY(-64);
    } else if(sprite.getY() < -64f){
        sprite.setY(Gdx.graphics.getHeight());
    }
}

您可以在Player上调用此函数以及遍历每个项目符号,例如:

fitOnScreen(Player1);
for (Bullet b: bullets) fitOnScreen(b.b);

答案 2 :(得分:0)

嗯,你问的是如何通过子弹的每个实例并改变它们的属性。

我必须同意@Zac的算法适用于一颗子弹,但你需要把它放在一个循环中以完成每一颗子弹以便有效。

以下是您在游戏画面的render()方法中可以执行的操作的示例:

Iterator<Bullet> it = bullets.iterator();
while(it.hasNext()) {
    Bullet bullet = it.next();
    // Now you do the position correction
    bullet.b.setPosition(bullet.b.getX()%Gdx.graphics.getWidth(), bullet.b.getY()%Gdx.graphics.getHeight());
}

当然还有其他方法可以做到这一点,但这可能是最简单的方法。您也可以在此循环中回收您为播放器使用的代码。

另外,请注意,使用此方法,项目符号越多,应用程序就越迟钝。