简体   繁体   中英

Bullet not shooting next to my spaceship sprite(LIbgdx)

I'm trying to get a bullet to shoot out of the spaceship sprite every time the screen is touched but the bullet sprite just moves from the left corner of the screen. Please help

Bullet Class

public class Bullet {
  public Vector2 bulletLocation = new Vector2(0,0);
  public Vector2 bulletVelocity = new Vector2(0,0);

  public Bullet(Vector2 sentLocation,Vector2 sentVelocity){
    bulletLocation = new Vector2(sentLocation.x,sentLocation.y);
    bulletVelocity = new Vector2(sentVelocity.x,sentVelocity.y);
  }

  public void Update(){
    bulletLocation.x+=bulletVelocity.x;
    bulletLocation.y+= bulletVelocity.y;
  }
}

Main Class

public class MyGdxGame extends ApplicationAdapter implements ApplicationListener,InputProcessor {
  SpriteBatch batch;
  private Sprite spriteLeftButton;
  private Sprite spriteRightButton;
  private Sprite spaceShip;
  private Texture buttonTexture;
  private OrthographicCamera camera;
  private Rectangle leftButton, rightButton, spaceshipr;
  private TextureRegion region;
  private Sprite spriteBullet;
  private Array<Rectangle> raindrops;
  private long lastDropTime;
  private Rectangle raindrop;
  private Rectangle camSize;
  Vector2 shipLocation = new Vector2(0, 0);
  Vector2 cursorLocation = new Vector2(0, 0);
  float screenWidth = 0;
  float screenHeight = 0;

  Bullet testBullet = new Bullet(shipLocation, new Vector2(10, 0));

  ArrayList<Bullet> bulletManager = new ArrayList<Bullet>();

  @Override
  public void create() {

    //gets screen dimensions
    screenWidth = Gdx.graphics.getWidth();
    screenHeight = Gdx.graphics.getHeight();

    raindrops = new Array<Rectangle>();
    raindrop = new Rectangle();
    raindrops.add(raindrop);
    lastDropTime = TimeUtils.nanoTime();

    camera = new OrthographicCamera();
    camera.setToOrtho(false, 800, 480);

    batch = new SpriteBatch();
    buttonTexture = new Texture(Gdx.files.internal("pics/idf_frigate_tut_06.jpg"));
    spaceShip = new Sprite(buttonTexture);
    spaceShip.setPosition(300, 300);


    spaceshipr = new Rectangle();
    spaceshipr.x = 300 / 2 - 64 / 2;
    spaceshipr.y = 20;
    spaceshipr.width = 64;
    spaceshipr.height = 64;

    buttonTexture = new Texture(Gdx.files.internal("pics/bullet.jpg"));
    spriteBullet = new Sprite(buttonTexture);

    //try buttonTexture
    Gdx.input.setInputProcessor(this);
  }

  @Override
  public void render() {

    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);


    camera.update();
    batch.setProjectionMatrix(camera.combined);

    batch.begin();
    batch.draw(spaceShip, spaceshipr.x, spaceshipr.y);
    if(Gdx.input.isTouched()){
      batch.draw(spriteBullet, spaceshipr.x,spaceshipr.y);

      int counter = 0;
      while (counter < bulletManager.size()) {

        Bullet currentBullet = bulletManager.get(counter);
        currentBullet.Update();

        batch.draw(spriteBullet, currentBullet.bulletLocation.x,currentBullet.bulletLocation.y);
        counter++;
      }
    }
    batch.end();
  }

  @Override
  public boolean keyDown(int keycode) {
    return false;
  }

  @Override
  public boolean keyUp(int keycode) {
    return false;
  }

  @Override
  public boolean keyTyped(char character) {
    return false;
  }

  @Override
  public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    if (Gdx.input.isTouched()) {
      Vector3 touchPos = new Vector3();
      touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
      camera.unproject(touchPos);
      spaceshipr.x = touchPos.x - 64;
      spaceshipr.y = touchPos.y - 64;

      raindrop.x = touchPos.x + 50;
      raindrop.y = touchPos.y + 50;

      Bullet myBullet = new Bullet(shipLocation, new Vector2(0,10));
      bulletManager.add(myBullet);
    }

    return true;
  }

  @Override
  public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    return false;
  }

  @Override
  public boolean touchDragged(int screenX, int screenY, int pointer) {
    if(Gdx.input.isTouched()) {
      Vector3 touchPos = new Vector3();
      touchPos.set(Gdx.input.getX(), Gdx.input.getY(), 0);
      camera.unproject(touchPos);
      spaceshipr.x = touchPos.x - 64;
      spaceshipr.y = touchPos.y - 64;
    }
  }
}

The problem is you put every new bullet to shipLocation , which is not updated during the game. Use current coordinates of the ship and create a new 2d vector instead.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM