如何使用布尔函数显示处理游戏的不同“菜单”

时间:2019-09-30 08:03:35

标签: boolean refactoring processing

我正在为“ Flappy Bird”版本编写代码。我正在尝试制作开始菜单,结束菜单和难度菜单。到目前为止,我在开始和结束方面都取得了成功,但是在显示难度菜单时却遇到了困难。我相信我的代码也很凌乱,想整理一下,但不知道从哪里开始。

我尝试在booleanPressed方法的参数中添加布尔值“ diff”并将其包括为false。

void mousePressed() {

  //START MENU
  if (menu==true&&end==false) {
    if (mouseX > 175 && mouseX < 625 && mouseY > 500 && mouseY < 600)      {
      menu = false;
      end = true;    
    }
    if (mouseX > 175 && mouseX < 625 && mouseY > 650 && mouseY < 750) {
      diff();
    }
  }

  //GAMEPLAY
  if (menu==false&&end==true) {
    b.bounce();
  }

  //END MENU
  if (menu==false&&end==false) {
    if (mouseX > 200 && mouseX < 600 && mouseY > 500 && mouseY < 600) {
      restart();
      b.bounce();
    }
    if (mouseX > 200 && mouseX < 600 && mouseY > 650 && mouseY < 750) {
      startMenu();
    }
  }
}

我希望输出显示难度菜单,但只显示一帧难度菜单,然后返回到开始菜单。

1 个答案:

答案 0 :(得分:1)

我假设您的diff()函数绘制了难度菜单。我还假设您有一个draw()函数,该函数根据游戏的当前状态(菜单,游戏,结束菜单等)来绘制内容。

问题在于,当您在难度按钮上按下鼠标时,您一次绘制了难度菜单,然后draw()立即覆盖了它。

在连续绘制的程序中(例如draw()),每当要显示一帧以上的内容时,都需要在每一帧(即draw()中)绘制。

解决方案是添加“困难菜单”状态。然后,您的draw()函数将像这样工作:

void draw() {
    if (menu && !diff && !end) {
        drawMenu();
    } else if (!menu && diff && !end) {
        diff();
    } else if (!menu && !diff && end) {
        //Why do you draw the game when end is TRUE?
        drawGame();
    } else if (!menu && !diff && !end) {
        //Why do you draw the end menu when end is FALSE?
        drawEndMenu();
    }
}

当然,您还需要修改mousePressed()函数。


您还说过,您觉得自己的代码很乱。这是一种代码气味;每当您在编程时感觉到“错误”时,通常意味着有更好的方法来执行此操作。很好,您注意到了这一点。

  • 首先,您的函数名有点不具描述性:我推荐使用类似diff()的名称,而不是drawDiffMenu()。经验法则:函数名称几乎总是应该是动词。

  • 其次,您不应该使用一堆布尔值来处理游戏状态。由于一次只能有一个状态,因此只能有一个变量。 (如果您需要状态内部的状态,请创建另一个变量。)做到这一点的最佳方法是使用enums!

示例:

enum GameState {
    MENU, GAME, DIFF_MENU, END
}
GameState gameState = GameState.MENU;

//...

void draw() {

    // Google "java switch statement"
    if (gameState == GameState.MENU) {
        drawMenu();
    } else if (gameState == GamesState.DIFF_MENU) {
        drawDiffMenu();
    } else if...
    // Etc...
}

一个挑剔的选择:在b.bounce()之后调用restart()有点奇怪,因为从理论上讲反弹应该是游戏开始的一部分。

编码愉快!