国家管理 - [转换国家,重播比赛]

时间:2014-08-10 08:01:05

标签: java user-input slick2d 2d-games state-management

如何有效地切换状态?每当我按下重放按钮时,两个状态交替显示(赢和播放)。我相信这是一个无限循环,但Eclipse不会打印任何错误。

当我尝试this时,结果为null。因此,结束游戏。 可以this成为答案吗?但我不明白他的更新()。究竟要放什么?会覆盖州级的更新吗?

这是我的代码: stateID(2)是Wins.java

PlayGround.java

   public static boolean bouncy = true;   
   public void update(GameContainer gc, StateBasedGame sbg, int delta) throws            SlickException{
             //if the user is successful, show winner state
            if(!bouncy){
                sbg.enterState(2);
            }
           //moves the image randomly in the screen
        new Timer(10,new ActionListener(){
              public void actionPerformed(ActionEvent e)
              {
                  posX = (r.nextInt(TestProject4.appGC.getWidth()-75));
                  posY = (r.nextInt(TestProject4.appGC.getHeight()-75));
              }
         }).start();


    }          
    public void mousePressed(int button,int x,int y){
         //if the user pressed the mouse button And
         //if the user's coordinates is inside the hit area(rect)
        if((button == 0) && (rect.contains(x, y))){
            Toolkit.getDefaultToolkit().beep();
              bouncy = false;
        }
    }

Wins.java

    @Override
public void update(GameContainer gc, StateBasedGame sbg, int delta)throws SlickException {
    //replay game
    if(backToGame == true){
        sbg.enterState(state);
    }
}

public void mousePressed(int button,int x,int y){
     //if the user clicks the replay button
    if(button == 0){        
      if((x>160 && x<260)&&(y>280 && y<320)){
             if(Mouse.isButtonDown(0)){
                    backToGame = true;                      
                    state = 1;
             }
          }

          //exit button
          if((x>=360 && x<460)&&(y>280 && y<320)){
             if(Mouse.isButtonDown(0)){
                System.exit(0);
          }
       }
    }
}

2 个答案:

答案 0 :(得分:2)

我认为你一次又一次地在两个状态之间切换,因为当你切换回时,两个GameState对象仍然处于相同的“状态”(变量仍具有相同的值)。

尝试:

if(!bouncy){
  bouncy = true; // next time we are in this game state it will not trigger immediately
  sbg.enterState(2);
}

if(backToGame == true){
  backToGame = false; // same here 
  sbg.enterState(state);
}

上一个回答:

请检查您的if语句:

  if((x>160 && x<180)||(y>280 && y<320)){

您正在检查鼠标是否在某些 x 坐标OR某些 y 坐标之间。

我想你想检查鼠标是否在某些 x AND某些 y 坐标之间:

  if((x>160 && x<180)&&(y>280 && y<320)){

答案 1 :(得分:0)

您的代码在PlayGround.java中有两个方法mousePressed(),另一个在Wins.java中。 该应用程序显然使用Playground.java代码。

将按钮检测代码添加到PlayGround.java可能会解决问题。

另外明智地从PlayGround.java中在Wins中显式调用mousePressed()方法 也可以。

添加评论帮助。 它可以显示您对项目的思路,帮助其他人尝试看看您在做什么。 在充实复杂的方法时,我首先过度评论,通过迭代的调试和代码审查来清除明显的注释。 当其他人查看您的代码时,我也会帮助您。 记住没有愚蠢的评论,只有愚蠢的人。