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