From 76341434ac944f451d9449562198cc58bc8a865a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sander=20=C3=98strem=20Fagernes?= <sanderof@stud.ntnu.no> Date: Thu, 30 Mar 2023 11:47:59 +0200 Subject: [PATCH] Resolve "Refactor main menu with scene2d" --- frontend/android/AndroidManifest.xml | 2 +- frontend/assets/menu-textures.atlas | 7 + frontend/assets/menu-textures.png | Bin 49797 -> 49832 bytes .../src/com/game/tankwars/TankWarsGame.java | 36 +--- .../tankwars/controller/LoginController.java | 29 +-- .../controller/MainMenuController.java | 108 ++++++----- .../com/game/tankwars/view/LoginScreen.java | 16 +- .../game/tankwars/view/MainMenuScreen.java | 169 ++++++++---------- 8 files changed, 170 insertions(+), 197 deletions(-) diff --git a/frontend/android/AndroidManifest.xml b/frontend/android/AndroidManifest.xml index a31d082..b0212e8 100644 --- a/frontend/android/AndroidManifest.xml +++ b/frontend/android/AndroidManifest.xml @@ -18,7 +18,7 @@ <activity android:name="com.game.tankwars.AndroidLauncher" android:label="@string/app_name" - android:screenOrientation="fullSensor" + android:screenOrientation="landscape" android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize|screenLayout" android:exported="true"> <intent-filter> diff --git a/frontend/assets/menu-textures.atlas b/frontend/assets/menu-textures.atlas index eefba79..23a3c97 100644 --- a/frontend/assets/menu-textures.atlas +++ b/frontend/assets/menu-textures.atlas @@ -53,6 +53,13 @@ logo orig: 134, 40 offset: 0, 0 index: -1 +transparent-white-box + rotate: false + xy: 907, 1009 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 typing-cursor rotate: false xy: 2, 2 diff --git a/frontend/assets/menu-textures.png b/frontend/assets/menu-textures.png index 7781c29d8792adc05f5e4f081b3a5828211ed536..c5ba22ba5b4830efdc5441dd056fd6dac89a2b3a 100644 GIT binary patch delta 5088 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 MLB|6{`@Ez72jHv`asU7T delta 5031 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 RQ3F8mpe=3xs5t5#_g^?C-WmV^ diff --git a/frontend/core/src/com/game/tankwars/TankWarsGame.java b/frontend/core/src/com/game/tankwars/TankWarsGame.java index 7ef4267..2e86cff 100644 --- a/frontend/core/src/com/game/tankwars/TankWarsGame.java +++ b/frontend/core/src/com/game/tankwars/TankWarsGame.java @@ -3,46 +3,16 @@ */ package com.game.tankwars; -import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Game; -import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Input; -import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.Sprite; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.math.Interpolation; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator; -import com.badlogic.gdx.math.Vector2; -import com.badlogic.gdx.math.Vector3; -import com.badlogic.gdx.physics.box2d.Body; -import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer; -import com.badlogic.gdx.physics.box2d.World; -import com.badlogic.gdx.utils.Array; -import com.badlogic.gdx.utils.ScreenUtils; -import com.game.tankwars.model.Box2dWorld; -import com.game.tankwars.model.Bullet; -import com.game.tankwars.model.Tank; import com.game.tankwars.view.LoginScreen; -import com.game.tankwars.view.MainMenuScreen; public class TankWarsGame extends Game { - public static int VIEWPORT_WIDTH = 80; - public static int VIEWPORT_HEIGHT = 50; - - private SpriteBatch batch; - private BitmapFont font; + public static int VIEWPORT_WIDTH = 320; + public static int VIEWPORT_HEIGHT = 240; @Override public void create() { - batch = new SpriteBatch(); - font = new BitmapFont(); this.setScreen(new LoginScreen(this)); } @@ -62,7 +32,5 @@ public class TankWarsGame extends Game { @Override public void dispose () { ResourceManager.getInstance().dispose(); - batch.dispose(); - font.dispose(); } } diff --git a/frontend/core/src/com/game/tankwars/controller/LoginController.java b/frontend/core/src/com/game/tankwars/controller/LoginController.java index 37830dd..845b3fa 100644 --- a/frontend/core/src/com/game/tankwars/controller/LoginController.java +++ b/frontend/core/src/com/game/tankwars/controller/LoginController.java @@ -6,9 +6,8 @@ import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; -import com.game.tankwars.ResourceManager; import com.game.tankwars.TankWarsGame; -import com.game.tankwars.view.GameScreen; +import com.game.tankwars.view.MainMenuScreen; /** * Todo: Login user on backend @@ -24,7 +23,7 @@ public class LoginController { private final TextButton loginButton; private final TextField usernameField; - public LoginController(final TankWarsGame tankWarsGame, final TextButton loginButton, final TextField usernameField, final Stage stage) { + public LoginController(final TankWarsGame tankWarsGame, TextButton loginButton, TextField usernameField, Stage stage) { this.tankWarsGame = tankWarsGame; this.loginButton = loginButton; this.usernameField = usernameField; @@ -34,6 +33,10 @@ public class LoginController { } public void setEventListeners() { + /* + * Calls the handleInput method when the login button is pressed, + * passing the username typed in the username field as an argument. + */ loginButton.addListener(new InputListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { @@ -42,11 +45,11 @@ public class LoginController { } }); + /* + * Unfocus text field and remove keyboard when enter is pressed, + * and move camera back to original position. + */ usernameField.addListener(new InputListener() { - /** - * Unfocus text field and remove keyboard when enter is pressed, - * and move camera back to original position. - */ @Override public boolean keyDown(InputEvent event, int keycode) { super.keyDown(event, keycode); @@ -60,11 +63,11 @@ public class LoginController { } }); + /* + * Move camera down when text field is clicked + * to make the field appear above the keyboard. + */ usernameField.addListener(new ClickListener() { - /** - * Move camera down when text field is clicked - * to make the field appear above the keyboard. - */ @Override public void clicked(InputEvent event, float x, float y) { super.clicked(event, x, y); @@ -77,9 +80,7 @@ public class LoginController { public void handleInput(String username) { System.out.println(username); - // TODO: Move clear line to MainMenuController when the main menu is operational - ResourceManager.getInstance().clear(); - tankWarsGame.setScreen(new GameScreen(tankWarsGame)); + tankWarsGame.setScreen(new MainMenuScreen(tankWarsGame)); } } diff --git a/frontend/core/src/com/game/tankwars/controller/MainMenuController.java b/frontend/core/src/com/game/tankwars/controller/MainMenuController.java index f07836c..38d14ea 100644 --- a/frontend/core/src/com/game/tankwars/controller/MainMenuController.java +++ b/frontend/core/src/com/game/tankwars/controller/MainMenuController.java @@ -1,64 +1,84 @@ package com.game.tankwars.controller; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.math.Vector3; -import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.game.tankwars.ResourceManager; import com.game.tankwars.TankWarsGame; -import com.game.tankwars.model.MenuButton; import com.game.tankwars.view.GameScreen; import com.game.tankwars.view.LeaderboardScreen; +import com.game.tankwars.view.LoginScreen; +/** + * Sets the event listeners for the buttons + * on the MainMenuScreen + */ public class MainMenuController { private final TankWarsGame tankWarsGame; - private String username; - private final Array<MenuButton> menuButtons; + private final TextButton findGameButton, highScoreButton, settingsButton, logoutButton; - - public MainMenuController(final TankWarsGame tankWarsGame, final BitmapFont font) { + public MainMenuController(final TankWarsGame tankWarsGame, TextButton findGameButton, + TextButton highScoreButton, TextButton settingsButton, + TextButton logoutButton) { this.tankWarsGame = tankWarsGame; + this.findGameButton = findGameButton; + this.highScoreButton = highScoreButton; + this.settingsButton = settingsButton; + this.logoutButton = logoutButton; - fetchUser(); - - this.menuButtons = new Array<>(); - } - - public Array<MenuButton> setMenuButtons(Texture buttonTexture, BitmapFont font) { - this.menuButtons.add(new MenuButton(buttonTexture, font, "Find Game")); - this.menuButtons.add(new MenuButton(buttonTexture, font, "Leaderboard")); - this.menuButtons.add(new MenuButton(buttonTexture, font, "Settings")); - this.menuButtons.add(new MenuButton(buttonTexture, font, "Log out")); - - return menuButtons; + setEventListeners(); } + private void setEventListeners() { + /* + * Transition to GameScreen + * Clear Resource Manager to dispose all menu-related textures + * TODO: Transition to FindGameScreen and then no longer clear ResourceManager + */ + findGameButton.addListener(new InputListener() { + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + ResourceManager.getInstance().clear(); + tankWarsGame.setScreen(new GameScreen(tankWarsGame)); + return true; + } + }); - public void handleInput(Vector3 touchPos) { - - for (int i = 0; i < menuButtons.size; i++) { - MenuButton menuButton = menuButtons.get(i); - if (touchPos.x >= menuButton.getX() && touchPos.x <= menuButton.getX() + menuButton.getWidth() && - touchPos.y >= menuButton.getY() && touchPos.y <= menuButton.getY() + menuButton.getHeight()) { - - switch (i) { - case 0: tankWarsGame.setScreen(new GameScreen(tankWarsGame)); break; - case 1: tankWarsGame.setScreen(new LeaderboardScreen(tankWarsGame)); break; - case 2: System.out.println("Settings button: Not yet functional"); break; - case 3: System.out.println("Log out button: Not yet functional"); break; - } + /* + * Transition to LeaderboardScreen + */ + highScoreButton.addListener(new InputListener() { + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + tankWarsGame.setScreen(new LeaderboardScreen(tankWarsGame)); + return true; } - } - } + }); - /** - * TODO: Fetch user from backend. For now it only creates a dummy username to pass to the screen - */ - private void fetchUser() { - this.username = "Commander"; - } + /* + * Transition to SettingsScreen (Dummy button for now) + * TODO: Implement the SettingsScreen class and add the transition + */ + settingsButton.addListener(new InputListener() { + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + System.out.println("Settings screen: yet to be implemented"); + return true; + } + }); - public String getUsername() { - return username; + /* + * Transition to LoginScreen + * Log out the user + * TODO: Log out the user - must be done after login functionality is implemented + */ + logoutButton.addListener(new InputListener() { + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + tankWarsGame.setScreen(new LoginScreen(tankWarsGame)); + return true; + } + }); } } diff --git a/frontend/core/src/com/game/tankwars/view/LoginScreen.java b/frontend/core/src/com/game/tankwars/view/LoginScreen.java index 0e50515..d59d545 100644 --- a/frontend/core/src/com/game/tankwars/view/LoginScreen.java +++ b/frontend/core/src/com/game/tankwars/view/LoginScreen.java @@ -2,25 +2,15 @@ package com.game.tankwars.view; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Screen; -import com.badlogic.gdx.graphics.Color; -import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.scenes.scene2d.Actor; -import com.badlogic.gdx.scenes.scene2d.Event; -import com.badlogic.gdx.scenes.scene2d.InputEvent; -import com.badlogic.gdx.scenes.scene2d.InputListener; import com.badlogic.gdx.scenes.scene2d.Stage; -import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.TextField; -import com.badlogic.gdx.scenes.scene2d.ui.Value; -import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.Drawable; -import com.badlogic.gdx.scenes.scene2d.utils.FocusListener; import com.badlogic.gdx.utils.Align; import com.badlogic.gdx.utils.ScreenUtils; import com.badlogic.gdx.utils.viewport.ExtendViewport; @@ -37,7 +27,6 @@ import com.game.tankwars.controller.LoginController; public class LoginScreen implements Screen { private final TankWarsGame tankWarsGame; private Stage stage; - private TextField usernameField; public LoginScreen(final TankWarsGame tankWarsGame) { this.tankWarsGame = tankWarsGame; @@ -45,7 +34,7 @@ public class LoginScreen implements Screen { @Override public void show() { - stage = new Stage(new ExtendViewport(320, 240), new SpriteBatch()); + stage = new Stage(new ExtendViewport(tankWarsGame.getViewportWidth(), tankWarsGame.getViewportHeight()), new SpriteBatch()); Gdx.input.setInputProcessor(stage); Skin skin = ResourceManager.getInstance().loadAndGetMenuAssets(); @@ -60,7 +49,7 @@ public class LoginScreen implements Screen { Label loginLabel = new Label("Log in", skin.get("header", Label.LabelStyle.class)); Label usernameLabel = new Label("Username", skin.get("default", Label.LabelStyle.class)); - usernameField = new TextField("", + TextField usernameField = new TextField("", skin.get("default", TextField.TextFieldStyle.class)); usernameField.setAlignment(Align.center); TextButton loginButton = new TextButton("Log in", @@ -126,6 +115,7 @@ public class LoginScreen implements Screen { @Override public void hide() { Gdx.input.setInputProcessor(null); + dispose(); } diff --git a/frontend/core/src/com/game/tankwars/view/MainMenuScreen.java b/frontend/core/src/com/game/tankwars/view/MainMenuScreen.java index 5f665ec..08bdda5 100644 --- a/frontend/core/src/com/game/tankwars/view/MainMenuScreen.java +++ b/frontend/core/src/com/game/tankwars/view/MainMenuScreen.java @@ -3,116 +3,105 @@ package com.game.tankwars.view; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputAdapter; import com.badlogic.gdx.Screen; -import com.badlogic.gdx.graphics.OrthographicCamera; -import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.BitmapFont; -import com.badlogic.gdx.graphics.g2d.GlyphLayout; -import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.badlogic.gdx.math.Vector3; -import com.badlogic.gdx.utils.Array; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Skin; +import com.badlogic.gdx.scenes.scene2d.ui.Table; +import com.badlogic.gdx.scenes.scene2d.ui.TextButton; +import com.badlogic.gdx.scenes.scene2d.utils.Drawable; import com.badlogic.gdx.utils.ScreenUtils; -import com.badlogic.gdx.utils.viewport.FitViewport; -import com.badlogic.gdx.utils.viewport.Viewport; +import com.badlogic.gdx.utils.viewport.ExtendViewport; +import com.game.tankwars.ResourceManager; import com.game.tankwars.TankWarsGame; import com.game.tankwars.controller.MainMenuController; -import com.game.tankwars.model.MenuButton; +/** + * Main menu screen with buttons leading to the different screens in the application. + * + * The following transitions from the buttons are supported by the MainMenuController: + * Find game button transitions to GameScreen + * Highscore button transitions to LeaderboardScreen + * Settings button transitions to no screen as of now + * Log out button transitions to log in screen + */ public class MainMenuScreen extends InputAdapter implements Screen { private final TankWarsGame tankWarsGame; - private final SpriteBatch batch; - private final BitmapFont font; - private final Viewport viewport; - private final MainMenuController controller; - private final Sprite logo; - private final Texture welcomeBox; - private final Texture background; - private final Texture menuButtonTexture; - private final GlyphLayout welcomeLayout, usernameLayout; - - private final Array<MenuButton> menuButtons; - - private final Vector3 touchPos; - - private float heightPercentile; - - /** - * Main menu - * Only supports portrait mode - */ - public MainMenuScreen(final TankWarsGame tankWarsGame, final SpriteBatch batch, final BitmapFont font, final OrthographicCamera camera) { - this.tankWarsGame = tankWarsGame; - this.batch = batch; - this.font = font; - this.font.getData().setScale(0.55f); - - // TODO: Add landscape support, both on startup and on rotation - viewport = new FitViewport(camera.viewportWidth, camera.viewportHeight, camera); - heightPercentile = viewport.getWorldHeight() / 100; - controller = new MainMenuController(this.tankWarsGame, this.font); - - logo = new Sprite(new Texture("tankwars-logo.png")); - logo.setScale(1.3f); - logo.setPosition(-logo.getWidth() / 2, 32 * heightPercentile); - - welcomeBox = new Texture("main-menu-welcome-box.png"); - welcomeLayout = new GlyphLayout(font, "Welcome to duty"); - usernameLayout = new GlyphLayout(font, controller.getUsername()); + private Stage stage; - background = new Texture("menu-background.png"); - - menuButtonTexture = new Texture("menu-button-2.png"); - menuButtons = controller.setMenuButtons(menuButtonTexture, font); - for (int i = 0; i < menuButtons.size; i++) { - menuButtons.get(i).setPosition(0, -(12 * i - 4) * heightPercentile); - } - - touchPos = new Vector3(); + public MainMenuScreen(final TankWarsGame tankWarsGame) { + this.tankWarsGame = tankWarsGame; } @Override public void show() { - Gdx.input.setInputProcessor(this); + stage = new Stage(new ExtendViewport(tankWarsGame.getViewportWidth(), tankWarsGame.getViewportHeight()), new SpriteBatch()); + Gdx.input.setInputProcessor(stage); + + Skin skin = ResourceManager.getInstance().loadAndGetMenuAssets(); + + Drawable background = skin.getDrawable("camo-background-landscape"); + + Image logo = new Image(skin.getDrawable("logo")); + Drawable headerBox = skin.getDrawable("dark-menu-header"); + Label loginLabel = new Label("Main Menu", skin.get("header", Label.LabelStyle.class)); + + Drawable panelBackground = skin.getDrawable("transparent-white-box"); + TextButton findGameButton = new TextButton("Find game", + skin.get("default", TextButton.TextButtonStyle.class)); + TextButton highScoreButton = new TextButton("Highscore", + skin.get("default", TextButton.TextButtonStyle.class)); + TextButton settingsButton = new TextButton("Settings", + skin.get("default", TextButton.TextButtonStyle.class)); + TextButton logoutButton = new TextButton("Log out", + skin.get("default", TextButton.TextButtonStyle.class)); + + //--- Layout + Table rootTable = new Table(); + rootTable.setFillParent(true); + + float logoWidth = stage.getWidth() / 4f; + + Table headerTable = new Table(); + headerTable.background(headerBox); + headerTable.add(logo).width(logoWidth). + height(logo.getHeight() / logo.getWidth() * logoWidth).expandX(); + headerTable.add(loginLabel).expandX(); + + float buttonWidth = 3 * stage.getWidth() / 7f; + float buttonHeight = 32; + + Table panelTable = new Table(); + panelTable.background(panelBackground); + panelTable.row().expandY(); + panelTable.add(findGameButton).width(buttonWidth).expandX().height(buttonHeight); + panelTable.add(highScoreButton).width(buttonWidth).expandX().height(buttonHeight); + panelTable.row().expandY(); + panelTable.add(settingsButton).width(buttonWidth).expandX().height(buttonHeight); + panelTable.add(logoutButton).width(buttonWidth).expandX().height(buttonHeight); + + rootTable.background(background); + rootTable.add(headerTable).fillX().height(2 * stage.getHeight() / 7f).top(); + rootTable.row().expandY(); + rootTable.add(panelTable).fillX().height(3 * stage.getHeight() / 7f).bottom(); + + stage.addActor(rootTable); + new MainMenuController(this.tankWarsGame, findGameButton, highScoreButton, settingsButton, logoutButton); } @Override public void render(float delta) { ScreenUtils.clear(0, 0, 0, 1); - batch.setProjectionMatrix(viewport.getCamera().combined); - - batch.begin(); - batch.draw(background, -background.getWidth() / 2f, -background.getHeight() / 2f); - - logo.draw(batch); - - batch.draw(welcomeBox, -welcomeBox.getWidth() / 2f, 12 * heightPercentile, - viewport.getWorldWidth(), welcomeBox.getHeight()); - font.draw(batch, welcomeLayout, -welcomeLayout.width / 2, - 12 * heightPercentile + welcomeBox.getHeight() * 4f/5f); - font.draw(batch, usernameLayout, -usernameLayout.width / 2, - 12 * heightPercentile + welcomeBox.getHeight() * 4f/5f - 2 * welcomeLayout.height); - - for (MenuButton menuButton : menuButtons) { - batch.draw(menuButton.getTexture(), menuButton.getX(), menuButton.getY()); - font.draw(batch, menuButton.getContent(), menuButton.getContentX(), menuButton.getContentY()); - } - batch.end(); - } - - @Override - public boolean touchDown(int screenX, int screenY, int pointer, int button) { - touchPos.set(screenX, screenY, 0); - viewport.unproject(touchPos); - controller.handleInput(touchPos); - return true; + stage.act(delta); + stage.draw(); } @Override public void resize(int width, int height) { - viewport.update(width, height); - heightPercentile = viewport.getWorldHeight() / 100; + stage.getViewport().update(width, height); } @Override @@ -128,13 +117,11 @@ public class MainMenuScreen extends InputAdapter implements Screen { @Override public void hide() { Gdx.input.setInputProcessor(null); + dispose(); } @Override public void dispose() { - logo.getTexture().dispose(); - welcomeBox.dispose(); - background.dispose(); - menuButtonTexture.dispose(); + stage.dispose(); } } -- GitLab