diff --git a/core/src/main/java/group07/beatbattle/view/GameOverView.java b/core/src/main/java/group07/beatbattle/view/GameOverView.java index 6e5c095..eef29cd 100644 --- a/core/src/main/java/group07/beatbattle/view/GameOverView.java +++ b/core/src/main/java/group07/beatbattle/view/GameOverView.java @@ -50,9 +50,12 @@ public GameOverView(BeatBattle game, LeaderboardController controller) { ); stage.addActor(bgLogo); + float safeTop = Math.max(60f, Gdx.graphics.getSafeInsetTop() + 20f); + float safeBottom = Math.max(60f, Gdx.graphics.getSafeInsetBottom() + 10f); + Table root = new Table(); root.setFillParent(true); - root.pad(60f); + root.pad(safeTop, 60f, safeBottom, 60f); root.top(); // Title diff --git a/core/src/main/java/group07/beatbattle/view/GameRoundView.java b/core/src/main/java/group07/beatbattle/view/GameRoundView.java index f22631f..dff9e9a 100644 --- a/core/src/main/java/group07/beatbattle/view/GameRoundView.java +++ b/core/src/main/java/group07/beatbattle/view/GameRoundView.java @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.GlyphLayout; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Stage; @@ -31,8 +32,7 @@ public class GameRoundView extends ScreenAdapter { - private static final float ANSWER_BUTTON_WIDTH = 550f; - private static final float ANSWER_BUTTON_HEIGHT = 160f; + private static final float ANSWER_BUTTON_HEIGHT = 200f; private static final float ANSWER_SPACING = 30f; private static final float RESULT_DISPLAY_DELAY = 1.5f; @@ -92,8 +92,14 @@ public GameRoundView(BeatBattle game, RoundController controller) { ); stage.addActor(bgLogo); + float safeTop = Math.max(40f, Gdx.graphics.getSafeInsetTop() + 20f); + float safeBottom = Math.max(40f, Gdx.graphics.getSafeInsetBottom() + 10f); + // Width each answer button gets in the 2-column grid + float answerButtonWidth = (Gdx.graphics.getWidth() - 80f - ANSWER_SPACING * 4f) / 2f; + Table root = new Table(); root.setFillParent(true); + root.pad(safeTop, 40f, safeBottom, 40f); // --- Top bar: leave button + timer --- Table topBar = new Table(); @@ -141,17 +147,34 @@ public void changed(ChangeEvent event, Actor actor) { // --- Answer buttons 2x2 grid --- Table grid = new Table(); + GlyphLayout glyphLayout = new GlyphLayout(); + float innerWidth = answerButtonWidth - 20f; // 10px margin each side + float innerHeight = ANSWER_BUTTON_HEIGHT - 20f; // 10px margin top/bottom + for (int i = 0; i < options.size(); i++) { final String option = options.get(i); final TextButton btn = makeButton(option, defaultTex); + // Find the largest scale (max 1.0) at which the wrapped text fits in the box + float fontScale = 1.0f; + while (fontScale >= 0.5f) { + game.getMontserratFont().getData().setScale(fontScale); + glyphLayout.setText(game.getMontserratFont(), option, Color.WHITE, innerWidth, Align.center, true); + game.getMontserratFont().getData().setScale(1f); // restore immediately + if (glyphLayout.height <= innerHeight) break; + fontScale -= 0.05f; + } + fontScale = Math.max(fontScale, 0.5f); + btn.getLabel().setFontScale(fontScale); + + final float selectedScale = fontScale * 1.1f; btn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { if (answered) return; answered = true; btn.getStyle().up = new TextureRegionDrawable(new TextureRegion(selectedTex)); - btn.getLabel().setFontScale(1.15f); + btn.getLabel().setFontScale(selectedScale); for (TextButton other : optionButtons) { if (other != btn) { other.getStyle().up = new TextureRegionDrawable(new TextureRegion(disabledTex)); @@ -162,7 +185,7 @@ public void changed(ChangeEvent event, Actor actor) { }); optionButtons.add(btn); - grid.add(btn).width(ANSWER_BUTTON_WIDTH).height(ANSWER_BUTTON_HEIGHT).pad(ANSWER_SPACING); + grid.add(btn).width(answerButtonWidth).height(ANSWER_BUTTON_HEIGHT).pad(ANSWER_SPACING); if (i % 2 == 1) grid.row(); } @@ -245,6 +268,7 @@ private TextButton makeButton(String text, Texture texture) { TextButton btn = new TextButton(text, style); btn.getLabel().setWrap(true); + btn.getLabel().setAlignment(Align.center); return btn; } diff --git a/core/src/main/java/group07/beatbattle/view/JoinCreateView.java b/core/src/main/java/group07/beatbattle/view/JoinCreateView.java index b2c43fd..b997cd7 100644 --- a/core/src/main/java/group07/beatbattle/view/JoinCreateView.java +++ b/core/src/main/java/group07/beatbattle/view/JoinCreateView.java @@ -26,11 +26,8 @@ public class JoinCreateView extends ScreenAdapter { - private static final float FIELD_WIDTH = 800f; private static final float FIELD_HEIGHT = 120f; - private static final float READY_BUTTON_WIDTH = 800f; private static final float READY_BUTTON_HEIGHT = 150f; - private static final float BACK_BUTTON_WIDTH = 500f; private static final float BACK_BUTTON_HEIGHT = 120f; private final BeatBattle game; @@ -55,6 +52,11 @@ public JoinCreateView(BeatBattle game, GameMode mode, LobbyController controller this.stage = new Stage(new ScreenViewport()); this.lobbyService = new LobbyService(game.getFirebaseGateway()); + float screenWidth = Gdx.graphics.getWidth(); + float fieldWidth = Math.min(800f, screenWidth - 80f); + float readyButtonWidth = fieldWidth; + float backButtonWidth = Math.min(500f, fieldWidth * 0.65f); + Table root = new Table(); root.setFillParent(true); root.center(); @@ -93,13 +95,13 @@ public void changed(ChangeEvent event, Actor actor) { }); root.add(title).padBottom(80).row(); - root.add(codeComponent).width(FIELD_WIDTH).height(FIELD_HEIGHT).padBottom(40).row(); - root.add(playerNameField).width(FIELD_WIDTH).height(FIELD_HEIGHT).padBottom(50).row(); + root.add(codeComponent).width(fieldWidth).height(FIELD_HEIGHT).padBottom(40).row(); + root.add(playerNameField).width(fieldWidth).height(FIELD_HEIGHT).padBottom(50).row(); if (mode == GameMode.CREATE) { - root.add(roundSelector.getActor()).width(FIELD_WIDTH).padBottom(40).row(); + root.add(roundSelector.getActor()).width(fieldWidth).padBottom(40).row(); } - root.add(readyButton).width(READY_BUTTON_WIDTH).height(READY_BUTTON_HEIGHT).padBottom(30).row(); - root.add(backButton).width(BACK_BUTTON_WIDTH).height(BACK_BUTTON_HEIGHT); + root.add(readyButton).width(readyButtonWidth).height(READY_BUTTON_HEIGHT).padBottom(30).row(); + root.add(backButton).width(backButtonWidth).height(BACK_BUTTON_HEIGHT); stage.addActor(root); diff --git a/core/src/main/java/group07/beatbattle/view/LeaderboardView.java b/core/src/main/java/group07/beatbattle/view/LeaderboardView.java index 7794d09..adc3e6f 100644 --- a/core/src/main/java/group07/beatbattle/view/LeaderboardView.java +++ b/core/src/main/java/group07/beatbattle/view/LeaderboardView.java @@ -49,9 +49,12 @@ public LeaderboardView(BeatBattle game, LeaderboardController controller) { ); stage.addActor(bgLogo); + float safeTop = Math.max(60f, Gdx.graphics.getSafeInsetTop() + 20f); + float safeBottom = Math.max(60f, Gdx.graphics.getSafeInsetBottom() + 10f); + Table root = new Table(); root.setFillParent(true); - root.pad(60f); + root.pad(safeTop, 60f, safeBottom, 60f); root.top(); // --- Title --- diff --git a/core/src/main/java/group07/beatbattle/view/LobbyView.java b/core/src/main/java/group07/beatbattle/view/LobbyView.java index 97b18fe..eee94d1 100644 --- a/core/src/main/java/group07/beatbattle/view/LobbyView.java +++ b/core/src/main/java/group07/beatbattle/view/LobbyView.java @@ -88,11 +88,14 @@ public LobbyView( Table root = new Table(); root.setFillParent(true); + float safeTop = Math.max(20f, Gdx.graphics.getSafeInsetTop() + 10f); + float safeBottom = Math.max(40f, Gdx.graphics.getSafeInsetBottom() + 10f); + root.top(); - root.add(createHeader()).expandX().fillX().padTop(20).row(); + root.add(createHeader()).expandX().fillX().padTop(safeTop).row(); root.add(createGameCodeSection()).expandX().top().padTop(60).row(); root.add(createPartySection()).expand().center().padBottom(60).row(); - root.add(createFooter()).expandX().bottom().padBottom(40); + root.add(createFooter()).expandX().bottom().padBottom(safeBottom); stage.addActor(root); @@ -244,18 +247,19 @@ private Table createPartySection() { Table table = new Table(); table.center(); + int boxWidth = (int) Math.min(850f, Gdx.graphics.getWidth() - 60f); + int boxHeight = 620; + Label partyLabel = new Label(Strings.party(), infoStyle); - Table partyBox = createPartyBox(); + Table partyBox = createPartyBox(boxWidth, boxHeight); table.add(partyLabel).padBottom(20).row(); - table.add(partyBox).width(850).height(620); + table.add(partyBox).width(boxWidth).height(boxHeight); return table; } - private Table createPartyBox() { - int boxWidth = 850; - int boxHeight = 620; + private Table createPartyBox(int boxWidth, int boxHeight) { int radius = 60; Table container = new Table(); @@ -344,7 +348,8 @@ public void changed(ChangeEvent event, Actor actor) { } }); - footer.add(startButton).width(800).height(150); + float btnWidth = Math.min(800f, Gdx.graphics.getWidth() - 80f); + footer.add(startButton).width(btnWidth).height(150); } return footer;