2015-09-08 2 views
0

Привет, ребята, поэтому я создал простую игру с летающим вертолетом, в котором вам нужно уклоняться от ракет. Я хочу удалить все ракеты, созданные на экране, если true. То, что происходит, это только снимается, если вертолет умирает из-за удара ракеты, но если он умирает, ударяясь о землю, сообщение «игра над» показывает, но ракеты не удаляются!Удаление всех прямоугольников в прямоугольной матрице (LIBGDX)

Я попытался с помощью

if(heliR.overlaps(missiles)){gameOver=true; Iter.remove; } 

Но как то, что я сказал, что все ракеты удаляются только если бы я умер, ударив ракету, может кто-нибудь помочь мне в этом?

Вот мой код:

@Override 
public void create() 
{ 
    batch = new SpriteBatch(); 
    camera=new OrthographicCamera(); 
    camera.setToOrtho(false,800,480); 
    restart=TimeUtils.nanoTime(); 
    click=TimeUtils.nanoTime(); 

    //fonts 
    font=new BitmapFont(); 
    font1=new BitmapFont(); 
    font2=new BitmapFont(); 
    font.setColor(Color.RED); 
    font1.setColor(Color.BLACK); 
    font2.setColor(Color.WHITE); 
    font.setScale(3); 
    font1.setScale(1); 
    font2.setScale(2); 

    //score 
    points=0; 
    lastScore=TimeUtils.nanoTime(); 

    //background 
    Texture texture=new Texture(Gdx.files.internal("background.png")); 
    background=new TextureRegion(texture,0,0,800,480); 

    //logo 
    logo=new Texture(Gdx.files.internal("logo.png")); 
    logoR=new Rectangle(); 
    logoR.x=230; 
    logoR.y=240; 
    logoR.width=230; 
    logoR.height=100; 

    //helicopter 
    heli=new Texture(Gdx.files.internal("helicopter.png")); 
    heliR=new Rectangle(); 
    heliR.x=280; 
    heliR.y=400; 
    heliR.width=heli.getWidth()-15; 
    heliR.height=heli.getHeight()-15; 

    //Sounds 
    heliSound=Gdx.audio.newSound(Gdx.files.internal("helicopter.wav")); 
    heliLanding=Gdx.audio.newSound(Gdx.files.internal("helicopter_landing.wav")); 
    collision=Gdx.audio.newSound(Gdx.files.internal("collision.wav")); 

    //missile 
    missileImg=new Texture(Gdx.files.internal("missile.png")); 
    missiles=new Array<Rectangle>(); 
} 

public void spawnMissile(){ 
    Rectangle missile=new Rectangle(); 
    missile.y=MathUtils.random(60,400); 
    missile.x=mX; 
    missile.width=missileImg.getWidth()-15; 
    missile.height=missileImg.getHeight()-10; 
    missiles.add(missile); 
    lastMissile=TimeUtils.nanoTime(); 
    velocity=250; 
} 

@Override 
public void render() 
{   
    Gdx.gl.glClearColor(1, 1, 1, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    camera.update(); 
    batch.begin(); 
    batch.draw(background,backGroundX-800,0,800,480); 
    batch.draw(background,backGroundX,0,800,480); 
    batch.draw(heli,heliR.x,heliR.y); 
    if(justStart==false && gameOver==false){ 
     font2.draw(batch,"Points:"+points,345,480);} 
    //missile 
    for(Rectangle missile: missiles){ 
     batch.draw(missileImg,missile.x,missile.y); 
    } 

    //game over 
    if(gameOver==true){ 
     heliR.y=250; 
     heliR.x=330; 
     font.draw(batch,"Game Over",280,400); 
     font1.draw(batch,"[Long press on the screen to restart]",275,230); 
     font1.draw(batch,"Your points:"+points,348,250); 
     if(Gdx.input.isTouched()){ 
      longClick+=1; 

      if(longClick==35){ 
      gameOver=false; 
      points=0; 
      longClick=0; 
      heliR.y=300; 
      heliR.x=30; 
      } 
     }else{ 
      if(TimeUtils.nanoTime()- click > 2000000){longClick=0;} 
     } 
    } 
    //starting game 
    if(justStart==true){ 
     heliR.y=250; 
     heliR.x=330; 
     font2.draw(batch,"Touch the screen to start",230,230); 
     batch.draw(logo,logoR.x,logoR.y); 
     font1.draw(batch,"Developed by:Monzterr",5,15); 

     if(Gdx.input.isTouched()){ 
      justStart=false; 
      heliR.y=300; 
      heliR.x=30; 
     } 
    } 
    batch.end(); 
    //game physics 
    if(justStart==false&&gameOver==false){ 
     //missile 
     if(TimeUtils.nanoTime()-lastMissile > 1000000000){spawnMissile();} 
     Iterator <Rectangle> iter=missiles.iterator(); 
     while(iter.hasNext()){ 
      Rectangle missile= iter.next(); 
      missile.x-=velocity*Gdx.graphics.getDeltaTime(); 
      if(missile.x<=-10){iter.remove();} 
      if(missile.overlaps(heliR)){ 
       gameOver=true; 
       collision.play(); 
      } 
      if(gameOver==true){ 
       iter.remove(); 
      } 
     } 
     //background 
     backGroundX= backGroundX-100*Gdx.graphics.getDeltaTime(); 
     if(backGroundX<=0){ 
      backGroundX=800; 
     } 
     //score 
     if(TimeUtils.nanoTime()-lastScore>2000000000){ 
      points=points+1; 

      lastScore=TimeUtils.nanoTime(); 
     } 
     //gravity 
     if(Gdx.input.isTouched()){ 
      heliR.y+=5; 
      //heliLanding.play(); 
     }else{ 
      heliR.y-=5; 
      //heliLanding.pause(); 
      } 
    } 
    //borders 
    if(heliR.y>=400){ 
     heliR.y=250; 
    } 
    if(heliR.y<=56){ 
     heliR.y=56; 
     gameOver=true; 
     mX=800; 
     collision.play(); 
    } 
} 

@Override 
public void dispose() 
{ 
} 

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

@Override 
public void pause() 
{ 
} 

@Override 
public void resume() 
{ 
} 

Извините за грязный код, который я только начал изучать программирование на прошлой неделе.

ответ

0

Вы проверяете, если GameOver == верно дважды - один на (почти) начала визуализации() метод

//game over 
    if(gameOver==true){ 
     heliR.y=250; 
     ... 

и второй раз при следующих условиях

//game physics 
    if(justStart==false&&gameOver==false){ 
    ... 

, но вы удаляете итератор только во втором

if(gameOver==true){ 
      iter.remove(); 
     } 

исправление должно устранить вашу проблему. Рассмотрим также вам нужно две проверки, если GameOver верно (я полагаю, вы не - вы можете обрабатывать обе ситуации в первой)

0

Вы меняете gameOver истина, в середине цикла через всех врагов ваших, и только удаляя их изнутри цикла, поэтому только враги после тот, который вызвал игру, будет удален. Замените iter.remove() с перерывом (выпрыгнуть из петли, которая теперь не нужна для завершения). Затем добавьте строку после цикла:

if (gameOver) missiles.clear(); 

Это удаляет все из массива.

Смежные вопросы