1

アクターで撮影できません。射撃ボタンを押したままにすると、アクターの前に弾丸がありますが、動きません。どうすれば隕石のように動くのかわからない...

public class Game implements ApplicationListener {
   Texture meteoriteImage;
   Texture shipImage;
   Texture bulletImage;
   SpriteBatch batch;
   OrthographicCamera camera;
   Rectangle ship;
   Rectangle bullet;
   Array<Rectangle> meteorites;
   long lastMeteoriteTime;


   public void create() {
      meteoriteImage = new Texture(Gdx.files.internal("meteorite.png"));
      shipImage = new Texture(Gdx.files.internal("ship.png"));
      bulletImage = new Texture(Gdx.files.internal("bullet.png"));

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

      ship = new Rectangle();
      ship.x = 800 - 48;
      ship.y = 480 / 2 - 48 / 2;
      ship.width = 48;
      ship.height = 48;

      meteorites = new Array<Rectangle>();
      spawnMeteorite();
   }

   private void spawnMeteorite() {
      Rectangle meteorite = new Rectangle();
      meteorite.y = MathUtils.random(0, 480-48);
      meteorite.x = 0;
      meteorite.width = 48;
      meteorite.height = 48;
      meteorites.add(meteorite);
      lastMeteoriteTime = TimeUtils.nanoTime();
   }


   public void render() {
      Gdx.gl.glClearColor(0, 0, 0.2f, 1);
      Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
      camera.update();
      batch.setProjectionMatrix(camera.combined);

      batch.begin();
      batch.draw(shipImage, ship.x, ship.y);
      for(Rectangle meteorite: meteorites) {
         batch.draw(meteoriteImage, meteorite.x, meteorite.y);
      }
      batch.end();

      if(Gdx.input.isKeyPressed(Keys.DPAD_UP)) ship.y += 200 * Gdx.graphics.getDeltaTime();
      if(Gdx.input.isKeyPressed(Keys.DPAD_DOWN)) ship.y -= 200 * Gdx.graphics.getDeltaTime();
      if(Gdx.input.isKeyPressed(Keys.BUTTON_Y)){
              bullet = new Rectangle();
              bullet.x = ship.x - 48;
              bullet.y = ship.y;
              bullet.width = 48;
              bullet.height = 48;
              batch.begin();
              batch.draw(bulletImage, bullet.x, bullet.y);
              batch.end();

          while(bullet.x > 0){
              bullet.x -= 200 * Gdx.graphics.getDeltaTime();
          }
      }

      if(ship.x < 0) ship.x = 0;
      if(ship.x > 800 - 48) ship.x = 800 - 48;
      if(ship.y < 0) ship.y = 0;
      if(ship.y > 480 - 48) ship.y = 480 - 48;

      if(TimeUtils.nanoTime() - lastMeteoriteTime > 1000000000) spawnMeteorite();

      Iterator<Rectangle> iter = meteorites.iterator();
      while(iter.hasNext()) {
         Rectangle meteorite = iter.next();
         meteorite.x += 200 * Gdx.graphics.getDeltaTime();
         if(meteorite.x + 48 < 0) iter.remove();
         if(meteorite.overlaps(ship)) {

            iter.remove();
         }
      }
   }


   public void dispose() {
      shipImage.dispose();
      meteoriteImage.dispose();
      bulletImage.dispose();
      batch.dispose();
   }


   public void resize(int width, int height) {
   }


   public void pause() {
   }


   public void resume() {
   }
}

私はこのチュートリアルで作業しました: https://code.google.com/p/libgdx/wiki/SimpleApp

4

2 に答える 2

1

これは、あなたが望むものではありません。

while(bullet.x > 0){
    bullet.x -= 200 * Gdx.graphics.getDeltaTime();
}

箇条書きの位置をアニメートしたいですか?したがって、弾丸をオブジェクトとしてワールドに追加し、「Render」を呼び出すたびに x 位置を変更する必要があります。そうしないと、アニメーションがまったく表示されません...

于 2013-03-06T03:28:30.193 に答える
0

バレットループでチェックする隕石を見逃したようです。これを試してください:

while(iter2.hasNext()) {
  Rectangle bullet = iter2.next();
  bullet.x -= 200 * Gdx.graphics.getDeltaTime();
  if(bullet.x + 48 < 0) iter2.remove();
  iter = meteorites.iterator();
  while(iter.hasNext()) {
    if(bullet.overlaps(iter.next())) {
      iter2.remove();
      iter.remove();
    }
  }
}

両方のループに変換コードがあるため、元の隕石ループを単純に弾丸ループに入れないでください。

于 2013-10-01T01:52:01.903 に答える