From 9da73392d9fd987a2d6f41f0aab4e0bba86629dd Mon Sep 17 00:00:00 2001
From: Tor Martin Wang <tmwang@stud.ntnu.no>
Date: Tue, 7 Apr 2020 10:41:58 +0200
Subject: [PATCH] Almost completes issue #73

---
 frontend/android/AndroidManifest.xml          |   2 +-
 .../{glassy/raw => }/DimmingTexture.png       | Bin
 frontend/android/assets/LoadingText.png       | Bin 0 -> 10230 bytes
 .../core/src/com/gameware/game/GameWare.java  |   1 +
 .../gameware/game/sprites/LoadingText.java    |  59 ++++++++++++++++++
 .../gameware/game/states/BubbleWrapState.java |  16 +++--
 .../gameware/game/states/ColorRushState.java  |  20 +++---
 .../com/gameware/game/states/LoginState.java  |  38 ++++++++++-
 .../com/gameware/game/states/MenuState.java   |  22 ++++++-
 .../com/gameware/game/states/PauseState.java  |  24 +++++--
 .../game/states/PlayStateTemplate.java        |  39 +++++++++---
 .../game/states/ViewHighScoreState.java       |  23 ++++++-
 12 files changed, 201 insertions(+), 43 deletions(-)
 rename frontend/android/assets/{glassy/raw => }/DimmingTexture.png (100%)
 create mode 100644 frontend/android/assets/LoadingText.png
 create mode 100644 frontend/core/src/com/gameware/game/sprites/LoadingText.java

diff --git a/frontend/android/AndroidManifest.xml b/frontend/android/AndroidManifest.xml
index c849555..8ff4dbc 100644
--- a/frontend/android/AndroidManifest.xml
+++ b/frontend/android/AndroidManifest.xml
@@ -12,7 +12,7 @@
         android:theme="@style/GdxTheme" >
         <activity
             android:name="com.gameware.game.AndroidLauncher"
-            android:label="@string/app_name" 
+            android:label="@string/app_name"
             android:screenOrientation="portrait"
             android:configChanges="keyboard|keyboardHidden|navigation|orientation|screenSize|screenLayout">
             <intent-filter>
diff --git a/frontend/android/assets/glassy/raw/DimmingTexture.png b/frontend/android/assets/DimmingTexture.png
similarity index 100%
rename from frontend/android/assets/glassy/raw/DimmingTexture.png
rename to frontend/android/assets/DimmingTexture.png
diff --git a/frontend/android/assets/LoadingText.png b/frontend/android/assets/LoadingText.png
new file mode 100644
index 0000000000000000000000000000000000000000..818bf297f5bf214509f5870cd611ef8e1747a9aa
GIT binary patch
literal 10230
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
P3=9mOu6{1-oD!M<%}o*|

literal 0
HcmV?d00001

diff --git a/frontend/core/src/com/gameware/game/GameWare.java b/frontend/core/src/com/gameware/game/GameWare.java
index 3364214..aacb21b 100644
--- a/frontend/core/src/com/gameware/game/GameWare.java
+++ b/frontend/core/src/com/gameware/game/GameWare.java
@@ -70,6 +70,7 @@ public class GameWare extends ApplicationAdapter {
 		music.setVolume(0.1f);
 		toggleMusic();
 
+		//gsm.push(new LoginState(gsm));
 		gsm.push(new LoginState(gsm));
 
 //		try{
diff --git a/frontend/core/src/com/gameware/game/sprites/LoadingText.java b/frontend/core/src/com/gameware/game/sprites/LoadingText.java
new file mode 100644
index 0000000..965300d
--- /dev/null
+++ b/frontend/core/src/com/gameware/game/sprites/LoadingText.java
@@ -0,0 +1,59 @@
+package com.gameware.game.sprites;
+
+import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.SpriteBatch;
+
+public class LoadingText extends Sprite {
+    private boolean isLoading = false;
+    private boolean firstUpdateFinished = false;
+    private Texture loadingText = new Texture(Gdx.files.internal("LoadingText.png"));
+    private Texture dimmingBackgroundTexture = new Texture(Gdx.files.internal("DimmingTexture.png"));
+
+    @Override
+    public void reset() {
+        this.firstUpdateFinished = false;
+        this.isLoading = false;
+    }
+
+    @Override
+    public void draw(SpriteBatch sb) {
+        if(this.isLoading) {
+            sb.begin();
+            sb.draw(this.dimmingBackgroundTexture, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
+            sb.draw(this.loadingText, Gdx.graphics.getWidth() / 4, Gdx.graphics.getHeight() / 2, Gdx.graphics.getWidth() / 2, Gdx.graphics.getHeight() / 10);
+            sb.end();
+        }
+    }
+
+    @Override
+    public void update(float dt) {
+
+        // If we've already completed the first call to this update method after isLoading was
+        // set to true (this means that the draw method has been called) and the loading text is
+        // visible we know that the loading has finished
+        if(this.isLoading && this.firstUpdateFinished){
+            this.isLoading = false;
+            this.firstUpdateFinished = false;
+        }
+
+        // We need to wait one iteration of update() for the screen to render the loading text first
+        else if(this.isLoading){
+            this.firstUpdateFinished = true;
+        }
+    }
+
+    @Override
+    public void dispose() {
+        this.dimmingBackgroundTexture.dispose();
+        this.loadingText.dispose();
+    }
+
+    public void setLoading(){
+        this.isLoading = true;
+    }
+
+    public boolean textIsRendering(){
+        return this.firstUpdateFinished && this.isLoading;
+    }
+}
diff --git a/frontend/core/src/com/gameware/game/states/BubbleWrapState.java b/frontend/core/src/com/gameware/game/states/BubbleWrapState.java
index 6983a16..44f1377 100644
--- a/frontend/core/src/com/gameware/game/states/BubbleWrapState.java
+++ b/frontend/core/src/com/gameware/game/states/BubbleWrapState.java
@@ -82,20 +82,19 @@ public class BubbleWrapState extends PlayStateTemplate {
 
             // Keeps score consistent
             this.setScore(this.poppedBubbles);
-
-            // Checks if the pause button was pressed
-            super.checkPause();
         }
     }
 
     @Override
     public void update(float dt) {
+        super.update(dt);
+
         Gdx.input.setInputProcessor(stage);
 
         this.handleInput();
 
         this.currentTime += dt;
-        timeLabel.setText("Time left: " +  Math.round((totalTime - currentTime) * 100.0) / 100.0);
+        timeLabel.setText("Time left: " +  Math.max(Math.round((totalTime - currentTime) * 100.0) / 100.0, 0.00));
 
         // Game should finish if the time has run out
         if (this.currentTime >= this.totalTime) {
@@ -116,9 +115,7 @@ public class BubbleWrapState extends PlayStateTemplate {
     public void render(SpriteBatch sb) {
         stage.draw();
 
-        // Renders pause button
-        super.renderPauseButton(sb);
-
+        super.render(sb);
     }
 
     private void createBubbles() {
@@ -163,18 +160,19 @@ public class BubbleWrapState extends PlayStateTemplate {
     private void handleFinishedGame() {
         System.out.println("Game finished, starting new state");
         this.setScore(this.poppedBubbles);
-        this.gameDone();
+        super.setGameFinished();
         return;
     }
 
     @Override
     public void dispose() {
+        super.dispose();
+
         stage.dispose();
         this.unpopped.dispose();
         this.popped1.dispose();
         this.popped2.dispose();
         this.popped3.dispose();
-        super.pauseButton.dispose();
     }
 
     @Override
diff --git a/frontend/core/src/com/gameware/game/states/ColorRushState.java b/frontend/core/src/com/gameware/game/states/ColorRushState.java
index c669366..4be8805 100644
--- a/frontend/core/src/com/gameware/game/states/ColorRushState.java
+++ b/frontend/core/src/com/gameware/game/states/ColorRushState.java
@@ -7,7 +7,6 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.gameware.game.GameWare;
 import com.gameware.game.sprites.ColorRushButton;
 import com.gameware.game.sprites.ColorRushTarget;
-import com.gameware.game.sprites.PauseButton;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -103,23 +102,21 @@ public class ColorRushState extends PlayStateTemplate {
 
             // Keeps score consistent
             this.setScore(this.targetsHit);
-
-            //Pauses the game if the user pressed the pause button
-            super.checkPause();
         }
     }
 
     @Override
     public void update(float dt) {
+        super.update(dt);
 
         // Increases the current duration, used to keep track of the play duration and stop the game
         // after a while
         this.currentDuration += dt;
 
-        // Post score and exit if the game is over
+        // Set score and start rendering the loading text if the game is over
         if(this.currentDuration > this.totalGameDuration){
             this.setScore(this.targetsHit);
-            this.gameDone();
+            this.setGameFinished();
             return;
         }
 
@@ -171,14 +168,10 @@ public class ColorRushState extends PlayStateTemplate {
         sb.draw(this.background, 0, Gdx.graphics.getHeight()/5, Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
 
         // Time left
-        this.font.draw(sb, String.valueOf(Math.round((this.totalGameDuration - this.currentDuration) * 100) / 100.0), Gdx.graphics.getWidth()/40,Gdx.graphics.getHeight() - Gdx.graphics.getHeight()/40);
+        this.font.draw(sb, String.valueOf(Math.max(Math.round((this.totalGameDuration - this.currentDuration) * 100), 0.00) / 100.0), Gdx.graphics.getWidth()/40,Gdx.graphics.getHeight() - Gdx.graphics.getHeight()/40);
 
         sb.end();
 
-
-        // Renders pause button
-        super.renderPauseButton(sb);
-
         for (ColorRushButton button : this.buttons) {
             button.draw(sb);
         }
@@ -191,11 +184,13 @@ public class ColorRushState extends PlayStateTemplate {
             target.draw(sb);
         }
 
-
+        super.render(sb);
     }
 
     @Override
     public void dispose() {
+        super.dispose();
+
         for (ColorRushButton button : this.buttons) {
             button.dispose();
         }
@@ -215,7 +210,6 @@ public class ColorRushState extends PlayStateTemplate {
         this.font.dispose();
         this.background.dispose();
         this.disabledColorTexture.dispose();
-        super.pauseButton.dispose();
     }
 
     @Override
diff --git a/frontend/core/src/com/gameware/game/states/LoginState.java b/frontend/core/src/com/gameware/game/states/LoginState.java
index d4721ac..5ac4493 100644
--- a/frontend/core/src/com/gameware/game/states/LoginState.java
+++ b/frontend/core/src/com/gameware/game/states/LoginState.java
@@ -1,6 +1,7 @@
 package com.gameware.game.states;
 
 import com.badlogic.gdx.Gdx;
+import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.InputListener;
@@ -12,6 +13,7 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 import com.gameware.game.GameWare;
 import com.gameware.game.QueryIntermediate;
 import com.gameware.game.models.Player;
+import com.gameware.game.sprites.LoadingText;
 
 import java.io.IOException;
 import java.util.NoSuchElementException;
@@ -39,6 +41,12 @@ public class LoginState extends State {
     private String takenUsernameText = "Username already taken";
     private String ioExceptionText = "Something went wrong with query";
 
+    private LoadingText loadingText = new LoadingText();
+    private boolean loginBtnClicked = false;
+    private boolean signUpBtnClicked = false;
+
+
+
     public LoginState(GameStateManager gsm) {
         super(gsm);
         makeStage();
@@ -82,7 +90,7 @@ public class LoginState extends State {
         loginBtn.addListener(new ClickListener() {
             @Override
             public void clicked(InputEvent e, float x, float y){
-                handleLoginBtnClick();
+                setLoginBtnClicked();
             }
         });
         return loginBtn;
@@ -93,7 +101,7 @@ public class LoginState extends State {
         signUpBtn.addListener(new ClickListener() {
             @Override
             public void clicked(InputEvent e, float x, float y){
-                handleSignUpBtnClick();
+                setSignUpBtnClicked();
             }
         });
         return signUpBtn;
@@ -142,11 +150,23 @@ public class LoginState extends State {
     @Override
     public void update(float dt) {
         stage.act(dt);
+
+        if(this.loginBtnClicked && this.loadingText.textIsRendering()){
+            this.handleLoginBtnClick();
+        }
+
+        if(this.signUpBtnClicked && this.loadingText.textIsRendering()){
+            this.handleSignUpBtnClick();
+        }
+
+        this.loadingText.update(dt);
     }
 
     @Override
     public void render(SpriteBatch sb) {
         stage.draw();
+
+        this.loadingText.draw(sb);
     }
 
     @Override
@@ -160,6 +180,16 @@ public class LoginState extends State {
         passwordInputField.setText(passwordInputText);
     }
 
+    private void setLoginBtnClicked(){
+        this.loginBtnClicked = true;
+        this.loadingText.setLoading();
+    }
+
+    private void setSignUpBtnClicked(){
+        this.signUpBtnClicked = true;
+        this.loadingText.setLoading();
+    }
+
     private void handleLoginBtnClick(){
         String username = usernameInputField.getText();
         String password = passwordInputField.getText();
@@ -180,6 +210,8 @@ public class LoginState extends State {
             System.out.println(e);
             errorLabel.setText(e.getMessage());
         }
+
+        this.loginBtnClicked = false;
     }
 
     private void handleSignUpBtnClick(){
@@ -202,5 +234,7 @@ public class LoginState extends State {
             System.out.println(e);
             errorLabel.setText(e.getMessage());
         }
+
+        this.signUpBtnClicked = false;
     }
 }
diff --git a/frontend/core/src/com/gameware/game/states/MenuState.java b/frontend/core/src/com/gameware/game/states/MenuState.java
index ea9fa85..e6260a4 100644
--- a/frontend/core/src/com/gameware/game/states/MenuState.java
+++ b/frontend/core/src/com/gameware/game/states/MenuState.java
@@ -9,6 +9,7 @@ import com.badlogic.gdx.scenes.scene2d.ui.Table;
 import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 import com.gameware.game.GameWare;
+import com.gameware.game.sprites.LoadingText;
 
 public class MenuState extends State{
 
@@ -23,6 +24,10 @@ public class MenuState extends State{
     private String optionBtnText = "Options";
     private String logOutBtnText = "Log out";
 
+    private boolean multiBtnClicked = false;
+
+    private LoadingText loadingText = new LoadingText();
+
     public MenuState(GameStateManager gsm) {
         super(gsm);
         makeStage();
@@ -66,7 +71,7 @@ public class MenuState extends State{
         TextButton multiPlayerBtn = new TextButton(multiPlayerBtnText, skin);
         multiPlayerBtn.addListener(new ClickListener() {
             @Override
-            public void clicked(InputEvent e, float x, float y){ handleMultiBtnClick(); }
+            public void clicked(InputEvent e, float x, float y){ setMultiBtnClicked(); }
         });
         return multiPlayerBtn;
     }
@@ -110,6 +115,11 @@ public class MenuState extends State{
 
     @Override
     public void update(float dt) {
+        if(this.multiBtnClicked && this.loadingText.textIsRendering()){
+            this.handleMultiBtnClick();
+        }
+        this.loadingText.update(dt);
+
         Gdx.input.setInputProcessor(stage);
         Gdx.input.setCatchBackKey(true);
         handleInput();
@@ -117,7 +127,10 @@ public class MenuState extends State{
     }
 
     @Override
-    public void render(SpriteBatch sb) { stage.draw(); }
+    public void render(SpriteBatch sb) {
+        stage.draw();
+        this.loadingText.draw(sb);
+    }
 
     @Override
     public void dispose() { stage.dispose(); }
@@ -125,6 +138,11 @@ public class MenuState extends State{
     @Override
     public void reset() { }
 
+    private void setMultiBtnClicked(){
+        this.multiBtnClicked = true;
+        this.loadingText.setLoading();
+    }
+
     private void handleOptionsBtnClick(){
         gsm.set(new OptionsState(gsm));
     }
diff --git a/frontend/core/src/com/gameware/game/states/PauseState.java b/frontend/core/src/com/gameware/game/states/PauseState.java
index 8dccc6c..f6a3e9b 100644
--- a/frontend/core/src/com/gameware/game/states/PauseState.java
+++ b/frontend/core/src/com/gameware/game/states/PauseState.java
@@ -5,6 +5,7 @@ import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 import com.gameware.game.sprites.ConfirmationBox;
+import com.gameware.game.sprites.LoadingText;
 import com.gameware.game.sprites.PauseCircle;
 import com.gameware.game.sprites.PauseMenuButton;
 
@@ -22,18 +23,23 @@ public class PauseState extends State {
     private PauseMenuButton exitButton;
     private boolean needsConfirmation;
     private PlayStateTemplate pausedGame;
+    private LoadingText loadingText;
+    private boolean userExited;
 
     public PauseState(GameStateManager gsm, PlayStateTemplate pausedGame) {
         super(gsm);
 
         this.background = new Texture(Gdx.files.internal("glassy/raw/PauseBackground.jpg"));
         this.pauseText = new Texture(Gdx.files.internal("glassy/raw/PauseText.png"));
-        this.dimmingTexture = new Texture(Gdx.files.internal("glassy/raw/DimmingTexture.png"));
+        this.dimmingTexture = new Texture(Gdx.files.internal("DimmingTexture.png"));
 
         this.pauseCircles = new ArrayList<PauseCircle>();
 
         this.pausedGame = pausedGame;
 
+        this.loadingText = new LoadingText();
+        this.userExited = false;
+
         int confirmationBoxWidth = Gdx.graphics.getWidth()*7/8;
         int confirmationBoxHeight = confirmationBoxWidth/2;
         this.confirmationBox = new ConfirmationBox(Gdx.graphics.getWidth()/2 - confirmationBoxWidth/2, Gdx.graphics.getHeight()/2 - confirmationBoxHeight/2, confirmationBoxWidth, confirmationBoxHeight);
@@ -62,10 +68,11 @@ public class PauseState extends State {
                     this.needsConfirmation = false;
                 }
 
-                // User confirms the exit, posts the current score
+                // User confirms the exit, this will now render the loading text and then post the
+                // score and exit
                 if(this.confirmationBox.yesPressed(touchX, touchY)) {
-                    this.gsm.pop();
-                    this.pausedGame.gameDone();
+                    this.loadingText.setLoading();
+                    this.userExited = true;
                 }
             }
 
@@ -75,7 +82,7 @@ public class PauseState extends State {
                     this.gsm.pop();
                 }
 
-                // First step of exitting; user now needs to confirm the exit via the popup
+                // First step of exiting; user now needs to confirm the exit via the popup
                 if(this.exitButton.isPressed(touchX, touchY)){
                     this.needsConfirmation = true;
                 }
@@ -85,6 +92,12 @@ public class PauseState extends State {
 
     @Override
     public void update(float dt) {
+        if(this.userExited && this.loadingText.textIsRendering()){
+            this.gsm.pop();
+            this.pausedGame.gameDone();
+        }
+        this.loadingText.update(dt);
+
         this.handleInput();
 
         for(PauseCircle pc : this.pauseCircles){
@@ -133,6 +146,7 @@ public class PauseState extends State {
             this.confirmationBox.draw(sb);
         }
 
+        this.loadingText.draw(sb);
     }
 
     @Override
diff --git a/frontend/core/src/com/gameware/game/states/PlayStateTemplate.java b/frontend/core/src/com/gameware/game/states/PlayStateTemplate.java
index 12c2656..447f255 100644
--- a/frontend/core/src/com/gameware/game/states/PlayStateTemplate.java
+++ b/frontend/core/src/com/gameware/game/states/PlayStateTemplate.java
@@ -9,6 +9,7 @@ import com.gameware.game.QueryIntermediate;
 import com.gameware.game.models.Round;
 import com.gameware.game.models.RoundCheck;
 import com.gameware.game.models.Tournament;
+import com.gameware.game.sprites.LoadingText;
 import com.gameware.game.sprites.PauseButton;
 
 import java.io.IOException;
@@ -19,8 +20,9 @@ public abstract class PlayStateTemplate extends State {
     private Round round = null;
     private Tournament tournament = null;
     private Round nextRound = null;
-    protected PauseButton pauseButton;
+    private PauseButton pauseButton;
     private Round updatedRound = null;
+    private LoadingText loadingText = new LoadingText();
     protected float totalGameTime = 30f;
     protected Texture screenshot = null;
 
@@ -31,10 +33,31 @@ public abstract class PlayStateTemplate extends State {
         this.pauseButton = new PauseButton();
     }
 
-    public void renderPauseButton(SpriteBatch sb){
+    public void update(float dt){
+        // Updates the loading text; nothing happens if there is no loading
+        this.loadingText.update(dt);
+
+        // Post score and exit if the game is over and the loading text is rendering
+        if(this.loadingText.textIsRendering()){
+            this.gameDone();
+            return;
+        }
+
+        // Pause the game if the pause button was pressed
+        if(Gdx.input.justTouched() && this.pauseButton.isPressed(Gdx.input.getX(), Gdx.input.getY())){
+            this.gsm.push(new PauseState(this.gsm, this));
+        }
+    }
+
+    public void render(SpriteBatch sb){
+        this.loadingText.draw(sb);
         this.pauseButton.draw(sb);
     }
 
+    public void setGameFinished(){
+        this.loadingText.setLoading();
+    }
+
     public void setRound(Round r){
         this.round = r;
     }
@@ -104,13 +127,6 @@ public abstract class PlayStateTemplate extends State {
         }
     }
 
-    // Checks if the pause button was pressed, and pauses the minigame accordingly
-    public void checkPause(){
-        if(this.pauseButton.isPressed(Gdx.input.getX(), Gdx.input.getY())){
-            this.gsm.push(new PauseState(this.gsm, this));
-        }
-    }
-
     // Changes the color of the pause button to white
     public void setPauseButtonWhite(){
         this.pauseButton.setButtonWhite();
@@ -120,5 +136,10 @@ public abstract class PlayStateTemplate extends State {
     public void setPauseButtonBlack(){
         this.pauseButton.setButtonBlack();
     }
+
+    public void dispose(){
+        this.loadingText.dispose();
+        this.pauseButton.dispose();
+    }
 }
 
diff --git a/frontend/core/src/com/gameware/game/states/ViewHighScoreState.java b/frontend/core/src/com/gameware/game/states/ViewHighScoreState.java
index 05f2590..d08df0a 100644
--- a/frontend/core/src/com/gameware/game/states/ViewHighScoreState.java
+++ b/frontend/core/src/com/gameware/game/states/ViewHighScoreState.java
@@ -19,6 +19,8 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 import com.gameware.game.GameWare;
 import com.gameware.game.models.Game;
+import com.gameware.game.sprites.LoadingText;
+
 import java.io.IOException;
 
 public class ViewHighScoreState extends State {
@@ -34,6 +36,10 @@ public class ViewHighScoreState extends State {
     private Label stateNameLabel = new Label("High Scores", skin, "big");
     private Label secondStateNameLabel = new Label("Select game", skin, "big");
 
+    private Game chosenGame = null;
+
+    private LoadingText loadingText = new LoadingText();
+
     public ViewHighScoreState(GameStateManager gsm) {
         super(gsm);
 
@@ -97,6 +103,12 @@ public class ViewHighScoreState extends State {
 
     @Override
     public void update(float dt) {
+        if(this.chosenGame != null && this.loadingText.textIsRendering()){
+            this.handleGameBtnClick(this.chosenGame);
+        }
+        this.loadingText.update(dt);
+
+
         Gdx.input.setInputProcessor(stage);
         Gdx.input.setCatchBackKey(true);
         handleInput();
@@ -106,11 +118,13 @@ public class ViewHighScoreState extends State {
     @Override
     public void render(SpriteBatch sb) {
         stage.draw();
+        this.loadingText.draw(sb);
     }
 
     @Override
     public void dispose() {
         stage.dispose();
+        this.loadingText.dispose();
     }
 
     @Override
@@ -128,6 +142,11 @@ public class ViewHighScoreState extends State {
         return backBtn;
     }
 
+    private void setGameBtnClicked(Game game){
+        this.chosenGame = game;
+        this.loadingText.setLoading();
+    }
+
     private void handleBackBtnClick(){
         gsm.set(new MenuState(gsm));
     }
@@ -144,8 +163,8 @@ public class ViewHighScoreState extends State {
         }
 
         public void clicked(InputEvent event, float x, float y) {
-            handleGameBtnClick(game);
-
+            setGameBtnClicked(game);
         };
     }
+
 }
\ No newline at end of file
-- 
GitLab