From 4637363d7d8ee261d70c8be44b0b3bc510aacd04 Mon Sep 17 00:00:00 2001 From: Tor Martin Wang Date: Fri, 24 Apr 2020 17:03:55 +0200 Subject: [PATCH 1/4] Font now scales according to device width. Fixed other minor issues as well. Completes issue #102 --- .../gameware/game/sprites/{ => bubbleWrapSprites}/Bubble.java | 0 .../game/sprites/{ => colorRushSprites}/ColorRushButton.java | 0 .../game/sprites/{ => colorRushSprites}/ColorRushTarget.java | 0 .../gameware/game/sprites/{ => fruitSlicerSprites}/Fruit.java | 0 .../game/sprites/{ => fruitSlicerSprites}/SlicingCircle.java | 4 ++++ .../game/sprites/{ => pauseStateSprites}/ConfirmationBox.java | 3 ++- .../game/sprites/{ => pauseStateSprites}/PauseCircle.java | 3 ++- .../game/sprites/{ => pauseStateSprites}/PauseMenuButton.java | 3 ++- 8 files changed, 10 insertions(+), 3 deletions(-) rename frontend/core/src/com/gameware/game/sprites/{ => bubbleWrapSprites}/Bubble.java (100%) rename frontend/core/src/com/gameware/game/sprites/{ => colorRushSprites}/ColorRushButton.java (100%) rename frontend/core/src/com/gameware/game/sprites/{ => colorRushSprites}/ColorRushTarget.java (100%) rename frontend/core/src/com/gameware/game/sprites/{ => fruitSlicerSprites}/Fruit.java (100%) rename frontend/core/src/com/gameware/game/sprites/{ => fruitSlicerSprites}/SlicingCircle.java (93%) rename frontend/core/src/com/gameware/game/sprites/{ => pauseStateSprites}/ConfirmationBox.java (94%) rename frontend/core/src/com/gameware/game/sprites/{ => pauseStateSprites}/PauseCircle.java (95%) rename frontend/core/src/com/gameware/game/sprites/{ => pauseStateSprites}/PauseMenuButton.java (91%) diff --git a/frontend/core/src/com/gameware/game/sprites/Bubble.java b/frontend/core/src/com/gameware/game/sprites/bubbleWrapSprites/Bubble.java similarity index 100% rename from frontend/core/src/com/gameware/game/sprites/Bubble.java rename to frontend/core/src/com/gameware/game/sprites/bubbleWrapSprites/Bubble.java diff --git a/frontend/core/src/com/gameware/game/sprites/ColorRushButton.java b/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushButton.java similarity index 100% rename from frontend/core/src/com/gameware/game/sprites/ColorRushButton.java rename to frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushButton.java diff --git a/frontend/core/src/com/gameware/game/sprites/ColorRushTarget.java b/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushTarget.java similarity index 100% rename from frontend/core/src/com/gameware/game/sprites/ColorRushTarget.java rename to frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushTarget.java diff --git a/frontend/core/src/com/gameware/game/sprites/Fruit.java b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/Fruit.java similarity index 100% rename from frontend/core/src/com/gameware/game/sprites/Fruit.java rename to frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/Fruit.java diff --git a/frontend/core/src/com/gameware/game/sprites/SlicingCircle.java b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java similarity index 93% rename from frontend/core/src/com/gameware/game/sprites/SlicingCircle.java rename to frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java index 7ecfcef..2c3aa93 100644 --- a/frontend/core/src/com/gameware/game/sprites/SlicingCircle.java +++ b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java @@ -45,4 +45,8 @@ public class SlicingCircle extends Sprite { public boolean isDisposable(){ return this.width <= 0; } + + public Vector3 getPosition(){ + return this.position; + } } diff --git a/frontend/core/src/com/gameware/game/sprites/ConfirmationBox.java b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java similarity index 94% rename from frontend/core/src/com/gameware/game/sprites/ConfirmationBox.java rename to frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java index 1dd4fd9..7b04bc8 100644 --- a/frontend/core/src/com/gameware/game/sprites/ConfirmationBox.java +++ b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java @@ -1,9 +1,10 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.PauseStateSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; public class ConfirmationBox extends Sprite { private Texture boxTexture; diff --git a/frontend/core/src/com/gameware/game/sprites/PauseCircle.java b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java similarity index 95% rename from frontend/core/src/com/gameware/game/sprites/PauseCircle.java rename to frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java index 2f76c7f..6261724 100644 --- a/frontend/core/src/com/gameware/game/sprites/PauseCircle.java +++ b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java @@ -1,10 +1,11 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.PauseStateSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; public class PauseCircle extends Sprite { private int radius; diff --git a/frontend/core/src/com/gameware/game/sprites/PauseMenuButton.java b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java similarity index 91% rename from frontend/core/src/com/gameware/game/sprites/PauseMenuButton.java rename to frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java index 7b15386..30ba7f5 100644 --- a/frontend/core/src/com/gameware/game/sprites/PauseMenuButton.java +++ b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java @@ -1,8 +1,9 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.PauseStateSprites; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; public class PauseMenuButton extends Sprite { private Texture buttonTexture; -- GitLab From d4bcc1b1af696ab5cbc2447336b6420d97c94bca Mon Sep 17 00:00:00 2001 From: Tor Martin Wang Date: Fri, 24 Apr 2020 17:41:45 +0200 Subject: [PATCH 2/4] Made a leftover font scale with the device width. Completes issue #102 --- .../core/src/com/gameware/game/GameWare.java | 1 + .../sprites/bubbleWrapSprites/Bubble.java | 4 +++- .../colorRushSprites/ColorRushButton.java | 5 +++-- .../colorRushSprites/ColorRushTarget.java | 5 +++-- .../sprites/fruitSlicerSprites/Fruit.java | 3 ++- .../fruitSlicerSprites/SlicingCircle.java | 3 ++- .../pauseStateSprites/ConfirmationBox.java | 2 +- .../pauseStateSprites/PauseCircle.java | 2 +- .../pauseStateSprites/PauseMenuButton.java | 2 +- .../com/gameware/game/states/PauseState.java | 12 ++++++++---- .../game/states/games/BubbleWrapState.java | 2 +- .../game/states/games/ColorRushState.java | 4 ++-- .../game/states/games/FruitSlicerState.java | 19 +++++++++++-------- .../game/states/games/PlayStateUnion.java | 5 +++-- .../game/states/menus/MenuStateUnion.java | 10 +++++++--- .../states/menus/ViewTournamentState.java | 2 +- 16 files changed, 50 insertions(+), 31 deletions(-) diff --git a/frontend/core/src/com/gameware/game/GameWare.java b/frontend/core/src/com/gameware/game/GameWare.java index a9278ad..cedd96f 100644 --- a/frontend/core/src/com/gameware/game/GameWare.java +++ b/frontend/core/src/com/gameware/game/GameWare.java @@ -4,6 +4,7 @@ import com.badlogic.gdx.ApplicationAdapter; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.files.FileHandle; +import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonReader; diff --git a/frontend/core/src/com/gameware/game/sprites/bubbleWrapSprites/Bubble.java b/frontend/core/src/com/gameware/game/sprites/bubbleWrapSprites/Bubble.java index 5374aac..3374f9b 100644 --- a/frontend/core/src/com/gameware/game/sprites/bubbleWrapSprites/Bubble.java +++ b/frontend/core/src/com/gameware/game/sprites/bubbleWrapSprites/Bubble.java @@ -1,4 +1,4 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.bubbleWrapSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; @@ -7,6 +7,8 @@ import com.gameware.game.GameWare; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; + import java.util.ArrayList; import java.util.Random; diff --git a/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushButton.java b/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushButton.java index 19f7370..6cf67a1 100644 --- a/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushButton.java +++ b/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushButton.java @@ -1,4 +1,4 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.colorRushSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; @@ -6,8 +6,9 @@ import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; import com.gameware.game.GameWare; +import com.gameware.game.sprites.Sprite; -public class ColorRushButton extends Sprite{ +public class ColorRushButton extends Sprite { private Texture mainTexture; private Texture disabledTexture; private int colorNum; diff --git a/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushTarget.java b/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushTarget.java index cbd0da4..f637e5e 100644 --- a/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushTarget.java +++ b/frontend/core/src/com/gameware/game/sprites/colorRushSprites/ColorRushTarget.java @@ -1,11 +1,12 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.colorRushSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; -public class ColorRushTarget extends Sprite{ +public class ColorRushTarget extends Sprite { private int nextHeight; private Vector3 velocity; private Texture mainTexture; diff --git a/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/Fruit.java b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/Fruit.java index 6f23461..8489edb 100644 --- a/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/Fruit.java +++ b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/Fruit.java @@ -1,10 +1,11 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.fruitSlicerSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; public class Fruit extends Sprite { diff --git a/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java index 2c3aa93..fb49b4f 100644 --- a/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java +++ b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java @@ -1,9 +1,10 @@ -package com.gameware.game.sprites; +package com.gameware.game.sprites.fruitSlicerSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; +import com.gameware.game.sprites.Sprite; public class SlicingCircle extends Sprite { private Texture slicingVFX; diff --git a/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java index 7b04bc8..f876019 100644 --- a/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java +++ b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/ConfirmationBox.java @@ -1,4 +1,4 @@ -package com.gameware.game.sprites.PauseStateSprites; +package com.gameware.game.sprites.pauseStateSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; diff --git a/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java index 6261724..9a9fe52 100644 --- a/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java +++ b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseCircle.java @@ -1,4 +1,4 @@ -package com.gameware.game.sprites.PauseStateSprites; +package com.gameware.game.sprites.pauseStateSprites; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Color; diff --git a/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java index 30ba7f5..001e3b3 100644 --- a/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java +++ b/frontend/core/src/com/gameware/game/sprites/pauseStateSprites/PauseMenuButton.java @@ -1,4 +1,4 @@ -package com.gameware.game.sprites.PauseStateSprites; +package com.gameware.game.sprites.pauseStateSprites; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; diff --git a/frontend/core/src/com/gameware/game/states/PauseState.java b/frontend/core/src/com/gameware/game/states/PauseState.java index b59254c..ea14fa9 100644 --- a/frontend/core/src/com/gameware/game/states/PauseState.java +++ b/frontend/core/src/com/gameware/game/states/PauseState.java @@ -5,10 +5,10 @@ import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.gameware.game.GameWare; -import com.gameware.game.sprites.ConfirmationBox; +import com.gameware.game.sprites.pauseStateSprites.ConfirmationBox; import com.gameware.game.sprites.LoadingText; -import com.gameware.game.sprites.PauseCircle; -import com.gameware.game.sprites.PauseMenuButton; +import com.gameware.game.sprites.pauseStateSprites.PauseCircle; +import com.gameware.game.sprites.pauseStateSprites.PauseMenuButton; import com.gameware.game.states.games.PlayStateUnion; import java.util.ArrayList; @@ -231,5 +231,9 @@ public class PauseState extends State { } @Override - public void reset() { } + public void reset() { + this.needsConfirmation = false; + this.countdownStarted = false; + this.countdownDurationLeft = 3f; + } } diff --git a/frontend/core/src/com/gameware/game/states/games/BubbleWrapState.java b/frontend/core/src/com/gameware/game/states/games/BubbleWrapState.java index b7b15e8..a0df27a 100644 --- a/frontend/core/src/com/gameware/game/states/games/BubbleWrapState.java +++ b/frontend/core/src/com/gameware/game/states/games/BubbleWrapState.java @@ -3,7 +3,7 @@ package com.gameware.game.states.games; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.gameware.game.sprites.Bubble; +import com.gameware.game.sprites.bubbleWrapSprites.Bubble; import com.gameware.game.states.GameStateManager; import java.util.ArrayList; diff --git a/frontend/core/src/com/gameware/game/states/games/ColorRushState.java b/frontend/core/src/com/gameware/game/states/games/ColorRushState.java index 17127b6..21a2006 100644 --- a/frontend/core/src/com/gameware/game/states/games/ColorRushState.java +++ b/frontend/core/src/com/gameware/game/states/games/ColorRushState.java @@ -2,8 +2,8 @@ package com.gameware.game.states.games; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; -import com.gameware.game.sprites.ColorRushButton; -import com.gameware.game.sprites.ColorRushTarget; +import com.gameware.game.sprites.colorRushSprites.ColorRushButton; +import com.gameware.game.sprites.colorRushSprites.ColorRushTarget; import com.gameware.game.states.GameStateManager; import java.util.ArrayList; diff --git a/frontend/core/src/com/gameware/game/states/games/FruitSlicerState.java b/frontend/core/src/com/gameware/game/states/games/FruitSlicerState.java index 7861261..c337e16 100644 --- a/frontend/core/src/com/gameware/game/states/games/FruitSlicerState.java +++ b/frontend/core/src/com/gameware/game/states/games/FruitSlicerState.java @@ -6,8 +6,8 @@ import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Vector3; import com.gameware.game.GameWare; -import com.gameware.game.sprites.Fruit; -import com.gameware.game.sprites.SlicingCircle; +import com.gameware.game.sprites.fruitSlicerSprites.Fruit; +import com.gameware.game.sprites.fruitSlicerSprites.SlicingCircle; import com.gameware.game.states.GameStateManager; import java.util.ArrayList; @@ -35,6 +35,8 @@ public class FruitSlicerState extends PlayStateUnion { super(gsm); super.setTotalGameTime(60f); super.screenshot = new Texture(Gdx.files.internal("gameTextures/FruitSlicer/FruitSlicerPhotoEdit.png")); + super.setFontColorWhite(); + super.setPauseButtonWhite(); this.sliceWhooshSound = Gdx.audio.newSound(Gdx.files.internal("sfx/FruitSlicerWhooshSound.mp3")); this.sliceSquishSound = Gdx.audio.newSound(Gdx.files.internal("sfx/FruitSlicerSquishSound.mp3")); @@ -78,6 +80,12 @@ public class FruitSlicerState extends PlayStateUnion { this.oldTouchPosition.x = touchX; this.oldTouchPosition.y = touchY; } + + + // Adds new slicing circles if the user is touching + if(Gdx.input.isTouched()) { + this.slicingCircles.add(new SlicingCircle(Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY(), this.slicingCircleVFX)); + } } @Override @@ -87,11 +95,6 @@ public class FruitSlicerState extends PlayStateUnion { this.handleInput(); - // Adds new slicing circles if the user is touching - if(Gdx.input.isTouched()) { - this.slicingCircles.add(new SlicingCircle(Gdx.input.getX(), Gdx.graphics.getHeight() - Gdx.input.getY(), this.slicingCircleVFX)); - } - // Updates the slicing circles for(SlicingCircle slicingCircle : this.slicingCircles){ slicingCircle.update(dt); @@ -165,7 +168,7 @@ public class FruitSlicerState extends PlayStateUnion { // Four different emit modes: from left, from right, from entire bottom, and from bottom center with different velocity angles int emitMode = (int) (Math.random() * 4); Fruit fruit; - Texture fruitTexture = this.fruitTextures.get((int) (Math.random() * 20)); + Texture fruitTexture = this.fruitTextures.get((int) (Math.random() * this.fruitTextures.size())); Vector3 velocity = new Vector3(Gdx.graphics.getWidth() * 3 / 4, 0, 0); int x, y, emitAngle; diff --git a/frontend/core/src/com/gameware/game/states/games/PlayStateUnion.java b/frontend/core/src/com/gameware/game/states/games/PlayStateUnion.java index fac9149..a70a923 100644 --- a/frontend/core/src/com/gameware/game/states/games/PlayStateUnion.java +++ b/frontend/core/src/com/gameware/game/states/games/PlayStateUnion.java @@ -71,7 +71,7 @@ public abstract class PlayStateUnion extends State { // Default font (black color) font = new BitmapFont(); font.setColor(Color.BLACK); - font.getData().setScale((float) (Gdx.graphics.getWidth()/GameWare.WIDTH*1.75)); + font.getData().setScale((float) (Gdx.graphics.getWidth()/GameWare.WIDTH*2.5)); } // Override methods @@ -139,12 +139,13 @@ public abstract class PlayStateUnion extends State { if(this.timeLeftVisible && this.totalGameTime > 0f) { sb.begin(); // Time left - this.font.draw(sb, "Time: " + String.valueOf(Math.max(Math.round((this.totalGameTime - this.currentDuration) * 100), 0.00) / 100.0), Gdx.graphics.getWidth() / 40, Gdx.graphics.getHeight() - Gdx.graphics.getHeight() / 40 - Gdx.graphics.getHeight() / 60); + this.font.draw(sb, "Time: " + String.valueOf(Math.max(Math.round((this.totalGameTime - this.currentDuration) * 100), 0.00) / 100.0), Gdx.graphics.getWidth() / 40, Gdx.graphics.getHeight() - Gdx.graphics.getHeight() / 20); sb.end(); } if(this.currentScoreVisible){ sb.begin(); + //Score this.font.draw(sb, "Score: " + String.valueOf(this.score), Gdx.graphics.getWidth() / 40, Gdx.graphics.getHeight() - Gdx.graphics.getHeight() / 100); sb.end(); diff --git a/frontend/core/src/com/gameware/game/states/menus/MenuStateUnion.java b/frontend/core/src/com/gameware/game/states/menus/MenuStateUnion.java index f0ec2f8..e06108f 100644 --- a/frontend/core/src/com/gameware/game/states/menus/MenuStateUnion.java +++ b/frontend/core/src/com/gameware/game/states/menus/MenuStateUnion.java @@ -34,9 +34,10 @@ import com.gameware.game.states.State; public abstract class MenuStateUnion extends State { // Font - protected final float fontScale = 3f; - protected final float tinierTitleFontBigScale = 1.5f; - protected final float titleFontBigScale = 2.5f; + protected final float scaleRatio = Float.valueOf(Gdx.graphics.getWidth()) / 1080f; + protected final float fontScale = 3f * scaleRatio; + protected final float tinierTitleFontBigScale = 1.5f * scaleRatio; + protected final float titleFontBigScale = 2.5f * scaleRatio; // Spacing protected final float spacingLittle = Gdx.graphics.getHeight()/50; @@ -73,7 +74,10 @@ public abstract class MenuStateUnion extends State { public MenuStateUnion(GameStateManager gsm){ super(gsm); + + // Scales the font according to the ratio between the screen width and the default 1080 width skin.getFont("font").getData().setScale(fontScale); + skin.getFont("font-big").getData().setScale(this.scaleRatio); // Add sound effects this.checkBoxSound = Gdx.audio.newSound(Gdx.files.internal("sfx/check_box.ogg")); diff --git a/frontend/core/src/com/gameware/game/states/menus/ViewTournamentState.java b/frontend/core/src/com/gameware/game/states/menus/ViewTournamentState.java index ce794de..b37ed58 100644 --- a/frontend/core/src/com/gameware/game/states/menus/ViewTournamentState.java +++ b/frontend/core/src/com/gameware/game/states/menus/ViewTournamentState.java @@ -139,7 +139,7 @@ public class ViewTournamentState extends MenuStateUnion { rootTable.add(innerTable).colspan(2); rootTable.row(); rootTable.add(makeBackBtn()).expand().bottom().left(); - roundDeadline.setFontScale(0.8f); + roundDeadline.setFontScale(0.8f * super.scaleRatio); rootTable.add(roundDeadline).expand().bottom().right(); stage.addActor(rootTable); -- GitLab From 176549c614d7d02ab34784f529e8376c7fa4353a Mon Sep 17 00:00:00 2001 From: Tor Martin Wang Date: Fri, 24 Apr 2020 17:45:17 +0200 Subject: [PATCH 3/4] removed unused method from a sprite SlicingCircle --- .../game/sprites/fruitSlicerSprites/SlicingCircle.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java index fb49b4f..afd921a 100644 --- a/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java +++ b/frontend/core/src/com/gameware/game/sprites/fruitSlicerSprites/SlicingCircle.java @@ -46,8 +46,4 @@ public class SlicingCircle extends Sprite { public boolean isDisposable(){ return this.width <= 0; } - - public Vector3 getPosition(){ - return this.position; - } } -- GitLab From e52993578e052cf9e094f4f25d7041d60ac900ce Mon Sep 17 00:00:00 2001 From: Tor Martin Wang Date: Sat, 25 Apr 2020 11:11:55 +0200 Subject: [PATCH 4/4] Added a placeholder thumbnail for when a placeholder has not been set --- .../gameTextures/placeholderThumbnail.png | Bin 0 -> 268009 bytes .../game/states/games/BubbleWrapState.java | 2 +- .../game/states/games/ColorRushState.java | 2 +- .../game/states/games/FruitSlicerState.java | 2 +- .../game/states/games/PlayStateUnion.java | 12 +++++++++--- .../states/menus/CreateNewTournamentState.java | 2 +- .../menus/SinglePlayerSelectGameState.java | 2 +- .../game/states/menus/ViewHighScoreState.java | 2 +- .../game/states/menus/ViewTournamentState.java | 2 +- 9 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 frontend/android/assets/gameTextures/placeholderThumbnail.png diff --git a/frontend/android/assets/gameTextures/placeholderThumbnail.png b/frontend/android/assets/gameTextures/placeholderThumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..31ad5582832270ceb3c70ac378a6d5eb701bb6fe GIT binary patch literal 268009 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 o5~4^%AlaB10t^8_Kv8oQfAIADS2Cae2oYI)$