java - LibGDX button not working properly? -


i confused @ moment. know feeling when app should working fine, isn't reason?!

in app's playstate, have 3 states, defined variable "currentstate".

currentstate = 0 = running

currentstate = 1 = pause

currentstate = 2 = game over

public class playstate extends state { public static final int tube_spacing = 420; private static final int tube_count = 4; public static spritebatch batch;  public static preferences prefs;  private array<tube> tubes; private array<coin> coins; private boolean hasbeenplayed = false;  private texture pausemenu, coin, bg, grass, gameover; private sound boop, wow, ding; private music failed;   private bird bird; private vector2 groundpos1, groundpos2, groundpos3; private playstatebuttons pausebutton;  private bitmapfont highscorefont, coinsfont, font120;  private viewport viewport;  private int score = 0; private int gamestate; private boolean tablevisible, restartvisible; public playstate(gamestatemanager gsm, assetloader assets) {     super(gsm, assets);     initfonts();     gamestate = 0;     hasbeenplayed = false;     tablevisible = false;     restartvisible = false;      viewport = new stretchviewport(720, 1280,cam);     viewport.apply();     cam.position.set(cam.viewportwidth / 2, cam.viewportheight / 2,0);      batch = new spritebatch();     bg = assets.manager.get("textures/bg2.png", texture.class);     pausemenu = assets.manager.get("pausemenu.png", texture.class);     grass = assets.manager.get("grass.png", texture.class);     gameover = assets.manager.get("gameover.png", texture.class);     boop = assets.manager.get("boop.wav", sound.class);     failed = assets.manager.get("failed.wav", music.class);     wow = assets.manager.get("wow.wav", sound.class);     coin = assets.manager.get("coin.png", texture.class);     ding = assets.manager.get("ding.wav", sound.class);      prefs = gdx.app.getpreferences("bird");     if (!prefs.contains("highscore")) {         prefs.putinteger("highscore", 0);     }     if (!prefs.contains("coins"))         prefs.putinteger("coins", 0);      bird = new bird(100, 375, assets);      tubes = new array<tube>();     coins = new array<coin>();      pausebutton = new playstatebuttons(assets);      (int = 1; <= tube_count; i++){         tubes.add(new tube(i * (tube_spacing + tube.tube_width),assets));     }     for(int = 1; i<= 2; i++)         coins.add(new coin(2 * * (tube_spacing + tube.tube_width),assets));      }  public static void sethighscore(int val) {     prefs.putinteger("highscore", val);     prefs.flush(); } public void addcoin(){     ding.play();     prefs.putinteger("coins", prefs.getinteger("coins") + 1);     prefs.flush(); } public static int gethighscore() {     return prefs.getinteger("highscore"); } public int getcoins() { return prefs.getinteger("coins"); }     private void initfonts(){     font120 = assets.manager.get("fonts/myfont.ttf", bitmapfont.class);     highscorefont = assets.manager.get("fonts/highscore.ttf", bitmapfont.class);     coinsfont = assets.manager.get("fonts/coins.ttf", bitmapfont.class);  } @override public void resize(int width, int height){     viewport.update(width, height);     cam.position.set(cam.viewportwidth / 2, cam.viewportheight / 2,0); }  @override public void handleinput() {     if (gdx.input.justtouched() && gamestate == 0){         wow.play(0.6f);         bird.jump(); }     if(pausebutton.ispausebuttonpressed() && gamestate != 1) {         boop.play(0.9f);         gamestate = 1;         bird.die();     }     if(gamestate == 2) {         if(pausebutton.isrestartpressed())             gsm.set(new playstate(gsm, assets));     }      if(gamestate == 1) {         if (pausebutton.isresumepressed()) {             boop.play(0.9f);             gamestate = 0;             bird.resume();         }         if (pausebutton.ismenupressed()) {             boop.play(0.9f);             gsm.set(new menustate(gsm, assets));}         if (pausebutton.isshoppressed()) {             boop.play(0.9f);             gsm.set(new shopstatefaces(gsm, assets));             }         }      }  @override public void update(float dt) {     handleinput();     updateground();     if(gamestate == 0 && tablevisible){         pausebutton.removepausebuttons();         pausebutton.pausevisible();         tablevisible = false;     }     else if(gamestate == 2 && !restartvisible) {         pausebutton.restartvisible();         restartvisible = true;     }     else if(gamestate == 1 && !tablevisible) {         pausebutton.restartinvisible();         pausebutton.pauseinvisible();         pausebutton.displaypausebuttons();         tablevisible = true;     }      bird.update(dt);     cam.position.x = bird.getposition().x + 80;      for(tube tube : tubes){         if(cam.position.x - cam.viewportwidth / 2 > tube.getpostoptube().x + tube_width + 300) {             tube.reposition(tube.getpostoptube().x + (tube_width + tube_spacing) * tube_count);             tube.setscored(false);         }         if(tube.collides(bird.getbounds())) {             if(!hasbeenplayed) {                 failed.play();             }             gamestate = 2;             bird.die();             if(score > gethighscore())                 sethighscore(score);             hasbeenplayed = true;             return;         }         if (!tube.isscored() && bird.getposition().x > tube.getpostoptube().x + tube_width /2 + 300) {             addscore(1);             tube.setscored(true);     }     }     for(coin coin : coins){         if(cam.position.x - cam.viewportwidth / 2 > coin.getposcoin().x + 100 + 300){             coin.reposition(coin.getposcoin().x + (tube_width + tube_spacing) * tube_count);         }         if(coin.touches(bird.getbounds())){             addcoin();             coin.reposition(coin.getposcoin().x + 4 * (tube_width + tube_spacing));         }     }     cam.update();     if (bird.getposition().y <= grass.getheight() - 40) {         if(!hasbeenplayed) {             failed.play();         }         gamestate = 2;         bird.die();         if(score > gethighscore())             sethighscore(score);         hasbeenplayed = true;     }     if(gamestate != 2)         failed.stop(); }  public void addscore(int increment) {     score += increment; }   @override public void render(spritebatch sb) {     cam.update();     sb.setprojectionmatrix(cam.combined);     gdx.gl.glviewport(0, 0, gdx.graphics.getwidth(), gdx.graphics.getheight());     sb.begin();     sb.setcolor(color.white);     sb.draw(bg, cam.position.x - cam.viewportwidth / 2, 0, cam.viewportwidth, cam.viewportheight);     for(coin coin : coins){         sb.draw(coin.getcoin(), coin.getposcoin().x + 300, coin.getposcoin().y, 100, 100);     }      sb.draw(bird.gettexture(), bird.getposition().x, bird.getposition().y, bird.getbounds().getwidth(), bird.getbounds().getheight());      (tube tube : tubes) {             sb.draw(tube.gettoptube(), tube.getpostoptube().x + 300, tube.getpostoptube().y, 230, 1660);             sb.draw(tube.getbottomtube(), tube.getposbottube().x + 300, tube.getposbottube().y, 230, 1660);}         sb.draw(grass, groundpos1.x, groundpos1.y);         sb.draw(grass, groundpos2.x, groundpos2.y);         sb.draw(grass, groundpos3.x, groundpos3.y);         font120.draw(sb, score + "", cam.position.x - 29, cam.viewportheight - 100, 100, align.center, false);     string highscore = gethighscore() + "";     string coins = getcoins() + "";     if(gamestate == 2){         sb.draw(gameover, cam.position.x - gameover.getwidth() / 2 - 85 , cam.viewportheight / 2 - gameover.getheight() / 2, 600 , 500);         highscorefont.draw(sb, "highscore: " + highscore, cam.position.x - highscorefont.getscalex() / 2 - 250 , cam.viewportheight - 425, 500, align.center, true);         coinsfont.draw(sb, coins, cam.position.x - coinsfont.getscalex() / 2 - 195, cam.viewportheight - 590, 500, align.center, true);        sb.draw(coin, cam.position.x - 95, cam.viewportheight - 660, 90, 90);    }     else if(gamestate == 1){         sb.draw(pausemenu, cam.position.x - 315,cam.viewportheight / 2 - 625 / 2, 625, 625);     }     sb.end();     pausebutton.act();     pausebutton.draw(); }  @override public void dispose() {  } } 

i have different class created buttons playstate class, called playstatebuttons.

public class playstatebuttons { private viewport viewport; private stage stage; boolean pausebuttonclicked, restartpressed, shoppressed, resumepressed, menupressed; orthographiccamera cam; private table table; private button shopbutton, menubutton, resumebutton, restartbutton, pausebutton; private skin pausebuttonskin, resumebuttonskin, menubuttonskin, restartbuttonskin, shopbuttonskin;   public playstatebuttons(assetloader assets){     cam = new orthographiccamera();     viewport = new stretchviewport(720,1280, cam);     viewport.apply();     stage = new stage(viewport, playstate.batch);     gdx.input.setinputprocessor(stage);     table = new table();     stage.addactor(table);      button.buttonstyle pausebuttonstyle = new button.buttonstyle();     pausebuttonskin = new skin(assets.manager.get("pausebutton.atlas", textureatlas.class));     pausebuttonstyle.up = pausebuttonskin.getdrawable("pausebutton");     pausebuttonstyle.down = pausebuttonskin.getdrawable("pausebutton2");     pausebutton = new button(pausebuttonstyle);     pausebutton.setposition(55, 1150);     pausebutton.setsize(70, 70);     stage.addactor(pausebutton);     pausebutton.addlistener(new clicklistener(){         @override         public void clicked(inputevent event, float x, float y) {             pausebuttonclicked = true;         }     });      button.buttonstyle restartbuttonstyle = new button.buttonstyle();     restartbuttonskin = new skin(assets.manager.get("restartbutton.atlas", textureatlas.class));     restartbuttonstyle.up = restartbuttonskin.getdrawable("restartbutton");     restartbuttonstyle.down = restartbuttonskin.getdrawable("restartbutton.down");     restartbutton = new button(restartbuttonstyle);     restartbutton.setsize(350, 90);     restartbutton.setposition(cam.viewportwidth / 2 - restartbutton.getwidth() / 2, 525);     stage.addactor(restartbutton);     restartbutton.setvisible(false);     restartbutton.addlistener(new clicklistener(){         @override         public void clicked(inputevent event, float x, float y) {             restartpressed = true;         }     });      button.buttonstyle resumebuttonstyle = new button.buttonstyle();     resumebuttonskin = new skin(assets.manager.get("resumebutton.atlas", textureatlas.class));     resumebuttonstyle.up = resumebuttonskin.getdrawable("resumebutton");     resumebuttonstyle.down = resumebuttonskin.getdrawable("resumebutton.down");     resumebutton = new button(resumebuttonstyle);     stage.addactor(resumebutton);     resumebutton.addlistener(new clicklistener(){         @override         public void clicked(inputevent event, float x, float y) {             resumepressed = true;         }     });      button.buttonstyle menubuttonstyle = new button.buttonstyle();     menubuttonskin = new skin(assets.manager.get("menubutton.atlas", textureatlas.class));     menubuttonstyle.up = menubuttonskin.getdrawable("menubutton");     menubuttonstyle.down = menubuttonskin.getdrawable("menubutton.down");     menubutton = new button(menubuttonstyle);     stage.addactor(menubutton);     menubutton.addlistener(new clicklistener(){         @override         public void clicked(inputevent event, float x, float y) {             menupressed = true;         }     });      button.buttonstyle shopbuttonstyle = new button.buttonstyle();     shopbuttonskin = new skin(assets.manager.get("shopbutton.atlas", textureatlas.class));     shopbuttonstyle.up = shopbuttonskin.getdrawable("shopbutton");     shopbuttonstyle.down = shopbuttonskin.getdrawable("shopbutton.down");     shopbutton = new button(shopbuttonstyle);     stage.addactor(shopbutton);     shopbutton.addlistener(new clicklistener(){         @override         public void clicked(inputevent event, float x, float y) {             shoppressed = true;         }     });     table.add(resumebutton).padbottom(25);     table.row();     table.add(menubutton).padbottom(25);     table.row();     table.add(shopbutton);     table.setposition(cam.viewportwidth / 2, 560);     table.setvisible(false);  } public void draw(){     stage.draw(); }  public void act(){     stage.act(); }  public boolean ispausebuttonpressed() {     return pausebuttonclicked; }  public boolean isrestartpressed(){return restartpressed;}  public boolean isresumepressed(){return resumepressed;}  public boolean isshoppressed() {     return shoppressed; }  public boolean ismenupressed() {     return menupressed; }  public void restartvisible(){     restartbutton.setvisible(true); } public void restartinvisible() { restartbutton.setvisible(false); } public void displaypausebuttons(){     table.setvisible(true); }  public void pauseinvisible(){     pausebutton.setvisible(false); } public void pausevisible(){     pausebutton.setvisible(true); }  public void removepausebuttons(){     table.setvisible(false); }  public void resize(int width, int height) {   viewport.update(width, height);   }  public void dispose(){     stage.clear();} } 

the "resume" button supposed resume game pause running, when click it, resumes game, "boop" sound plays continuously forever , when bird collides anything, doesn't stop, displays game on menu while touching objects.

my theory "resumes" bird if resume button pressed, why cannot die , keeps playing sound. problem is, why hell doing that?!

once buttons clicked , set boolean pressed, there nothing in code ever sets pressed booleans false. once press button, pressed down forever.

this complicated , error prone way of handling these buttons anyway. convoluted have render method poll buttons see ones have been pressed.

get rid of booleans whether buttons pressed, , if-pressed cases in handleinput() method. each button's click listener should call method changes state, plays sound, etc. way code structured, need pass instance of playstate platstatebuttons constructor, various clicklisteners can access it.

as aside, buttons in libgdx behave more naturally if use changelistener on them instead of clicklistener.


Comments

Popular posts from this blog

php - Permission denied. Laravel linux server -

google bigquery - Delta between query execution time and Java query call to finish -

python - Pandas two dataframes multiplication? -