Como você está falando de telas, acho melhor separar toda essa lógica em diferentes telas. O que eu normalmente faço:
Defina uma interface chamada tela e faça com que várias telas a implementem. Como LoadingScreen, MainMenuScreen, GameScreen, GameOverScreen, HighScoreScreen etc. No seu jogo, você coloca uma variável que mantém a tela atual. A cada loop, você chama screen.update () e renderiza a tela atual. Isso economizará muito "se esse estado fizer isso", pois seu estado é definido pela tela atual.
Isso irá separar sua lógica muito bem.
Código de exemplo:
### 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();
}
}
Ou, dependendo da configuração do jogo, talvez você tenha um loop infinito como seu jogo.
while(true) {
calculatetimesincelastframe()
screen.update(time);
screen.render(time);
}