diff --git a/app/src/main/java/org/vibecoders/moongazer/Game.java b/app/src/main/java/org/vibecoders/moongazer/Game.java index 6218785..7dbd0cb 100644 --- a/app/src/main/java/org/vibecoders/moongazer/Game.java +++ b/app/src/main/java/org/vibecoders/moongazer/Game.java @@ -1,8 +1,11 @@ package org.vibecoders.moongazer; import com.badlogic.gdx.ApplicationAdapter; -import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.utils.viewport.ScreenViewport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,7 +17,10 @@ public class Game extends ApplicationAdapter { public static State state = State.INTRO; public static Transition transition = null; SpriteBatch batch; - Texture logo; + // UI stage + public Stage stage; + public Table root; + // Scenes Scene currentScene; Scene introScene; public static Scene mainMenuScene; @@ -25,7 +31,14 @@ public class Game extends ApplicationAdapter { Assets.loadIntroAndWait(); log.info("Intro assets loaded successfully."); batch = new SpriteBatch(); - currentScene = introScene = new Intro(); + // Stage for UI elements + stage = new Stage(new ScreenViewport(), batch); + Gdx.input.setInputProcessor(stage); + root = new Table(); + root.setFillParent(true); + stage.addActor(root); + // Scene initialization + currentScene = introScene = new Intro(this); // By the end of the intro, the main menu scene will be created and assigned to Game.mainMenuScene } @@ -36,6 +49,9 @@ public class Game extends ApplicationAdapter { batch.begin(); transition.render(batch); batch.end(); + // Handle stage drawing for UI elements + stage.act(Gdx.graphics.getDeltaTime()); + stage.draw(); return; } switch (Game.state) { @@ -54,6 +70,9 @@ public class Game extends ApplicationAdapter { batch.begin(); currentScene.render(batch); batch.end(); + // Handle stage drawing for UI elements + stage.act(Gdx.graphics.getDeltaTime()); + stage.draw(); } @Override @@ -61,6 +80,8 @@ public class Game extends ApplicationAdapter { introScene.dispose(); mainMenuScene.dispose(); Assets.dispose(); + batch.dispose(); + stage.dispose(); log.debug("Resources disposed"); } } diff --git a/app/src/main/java/org/vibecoders/moongazer/scenes/Intro.java b/app/src/main/java/org/vibecoders/moongazer/scenes/Intro.java index 1d8c31b..b5cbcb5 100644 --- a/app/src/main/java/org/vibecoders/moongazer/scenes/Intro.java +++ b/app/src/main/java/org/vibecoders/moongazer/scenes/Intro.java @@ -16,13 +16,15 @@ import com.badlogic.gdx.utils.ScreenUtils; */ public class Intro extends Scene { private Texture logo; + private Game game; private long startTime; private long endTime = 0; /** * Initializes the intro scene, starts loading assets. */ - public Intro() { + public Intro(Game game) { + this.game = game; logo = Assets.getAsset("icons/logo.png", Texture.class); startTime = System.currentTimeMillis() + 500; log.info("Starting to load all remaining assets..."); @@ -38,7 +40,7 @@ public class Intro extends Scene { if (System.currentTimeMillis() > endTime + 2000 && endTime != 0) { if (Game.transition == null) { Assets.waitUntilLoaded(); - Game.mainMenuScene = new MainMenu(); + Game.mainMenuScene = new MainMenu(game); Game.transition = new Transition(this, Game.mainMenuScene, State.MAIN_MENU, 1000); } batch.draw(TEXTURE_BLACK, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); diff --git a/app/src/main/java/org/vibecoders/moongazer/scenes/MainMenu.java b/app/src/main/java/org/vibecoders/moongazer/scenes/MainMenu.java index 6a86a46..66ce7e3 100644 --- a/app/src/main/java/org/vibecoders/moongazer/scenes/MainMenu.java +++ b/app/src/main/java/org/vibecoders/moongazer/scenes/MainMenu.java @@ -3,6 +3,7 @@ package org.vibecoders.moongazer.scenes; import static org.vibecoders.moongazer.Constants.*; import org.vibecoders.moongazer.managers.Assets; +import org.vibecoders.moongazer.Game; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.SpriteBatch; @@ -15,11 +16,12 @@ import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; public class MainMenu extends Scene { Label textLabel; - public MainMenu() { - super(); + public MainMenu(Game game) { + super(game); var font = Assets.getFont("ui", 24); textLabel = new Label("Moongazer", new LabelStyle(font, Color.BLACK)); textLabel.setPosition(WINDOW_WIDTH / 2f - textLabel.getWidth() / 2f, WINDOW_HEIGHT / 2f - textLabel.getHeight() / 2f); + game.root.addActor(textLabel); } /** * Renders the main menu scene. @@ -28,6 +30,7 @@ public class MainMenu extends Scene { @Override public void render(SpriteBatch batch) { batch.draw(TEXTURE_WHITE, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); - textLabel.draw(batch, 1.0f); + // Unneeded as using Scene2D Stage to render the label + // textLabel.draw(batch, 1.0f); } } diff --git a/app/src/main/java/org/vibecoders/moongazer/scenes/Scene.java b/app/src/main/java/org/vibecoders/moongazer/scenes/Scene.java index e7c8f95..7865bf2 100644 --- a/app/src/main/java/org/vibecoders/moongazer/scenes/Scene.java +++ b/app/src/main/java/org/vibecoders/moongazer/scenes/Scene.java @@ -1,12 +1,16 @@ package org.vibecoders.moongazer.scenes; import org.slf4j.Logger; +import org.vibecoders.moongazer.Game; import org.vibecoders.moongazer.managers.Assets; import com.badlogic.gdx.graphics.g2d.SpriteBatch; public abstract class Scene { protected final Logger log = org.slf4j.LoggerFactory.getLogger(getClass()); + public Scene(Game game) { + this(); + } public Scene() { if (!Assets.isLoadedAll() && Assets.isStartLoadAll()) { Assets.waitUntilLoaded();