fix: do not render invisible Scene and their root Table

This commit is contained in:
2025-09-30 11:36:42 +07:00
parent 9163a0aebb
commit e19259c2c4
5 changed files with 42 additions and 11 deletions

View File

@ -7,6 +7,8 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.vibecoders.moongazer.managers.Assets;
@ -14,8 +16,8 @@ import org.vibecoders.moongazer.scenes.*;
public class Game extends ApplicationAdapter {
private static final Logger log = LoggerFactory.getLogger(Game.class);
public static State state = State.INTRO;
public static Transition transition = null;
public State state = State.INTRO;
public Transition transition = null;
SpriteBatch batch;
// UI stage
public Stage stage;
@ -23,7 +25,8 @@ public class Game extends ApplicationAdapter {
// Scenes
Scene currentScene;
Scene introScene;
public static Scene mainMenuScene;
public Scene mainMenuScene;
public ArrayList<Scene> gameScenes;
@Override
public void create() {
@ -38,7 +41,9 @@ public class Game extends ApplicationAdapter {
root.setFillParent(true);
stage.addActor(root);
// Scene initialization
gameScenes = new ArrayList<>();
currentScene = introScene = new Intro(this);
gameScenes.add(introScene);
// By the end of the intro, the main menu scene will be created and assigned to Game.mainMenuScene
}
@ -54,7 +59,7 @@ public class Game extends ApplicationAdapter {
stage.draw();
return;
}
switch (Game.state) {
switch (this.state) {
case INTRO:
currentScene = introScene;
break;
@ -67,6 +72,20 @@ public class Game extends ApplicationAdapter {
default:
log.warn("Unknown state: {}", state);
}
for (var scene : gameScenes) {
// log.trace("Checking scene visibility: {}", scene.getClass().getSimpleName());
if (scene != currentScene && scene.root.isVisible()) {
log.trace("Hiding scene: {}", scene.getClass().getSimpleName());
scene.root.setVisible(false);
}
}
if (!currentScene.root.isVisible()) {
log.trace("Showing current scene: {}", currentScene.getClass().getSimpleName());
currentScene.root.setVisible(true);
}
batch.begin();
currentScene.render(batch);
batch.end();