我正在为“ 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();
}
}
}
我希望输出显示难度菜单,但只显示一帧难度菜单,然后返回到开始菜单。
答案 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()
有点奇怪,因为从理论上讲反弹应该是游戏开始的一部分。
编码愉快!