Como estás hablando de pantallas, creo que es mejor separar toda esa lógica en diferentes pantallas. Lo que normalmente hago:
Defina una interfaz llamada pantalla y haga que varias pantallas la implementen. Como LoadingScreen, MainMenuScreen, GameScreen, GameOverScreen, HighScoreScreen, etc. En su juego, coloca una variable que contiene la pantalla actual. Cada ciclo, llama a screen.update () y renderiza la pantalla actual. Esto le ahorrará mucho "si este estado hace eso", ya que su estado se define en la pantalla actual.
Esto separará su lógica muy bien.
Código de ejemplo:
### Screen interface ###
public interface Screen {
public void show();
public void update(float delta);
public void render(float delta);
public void hide ();
}
### An implementation of screen ###
public class MainMenuScreen implements Screen {
private Game game;
public MainMenuScreen(Game game) {
this.game = game;
}
public void show() {
// init stuff
}
public void update(float delta) {
// react to clicks, update animations etc.
if (buttonwasclicked) {
game.setScreen(new GameScreen(game)); // change the screen
}
}
public void render(float delta) {
// draw everything
}
public void hide() {
// release all resources, as the screen is being hidden
}
}
### Game, drawing the appropriate screen ###
public class Game {
public Screen screen;
public void update() {
screen.update(getDeltaTime);
screen.render();
}
public void setScreen(Screen screen) {
this.screen.hide();
this.screen = screen;
this.screen.show();
}
}
O dependiendo de la configuración de su juego, tal vez tenga un bucle infinito como juego.
while(true) {
calculatetimesincelastframe()
screen.update(time);
screen.render(time);
}