From d045243c7acd3d86fbb3f65c5d0e6b7643490d14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=E1=BA=BF=20H=C6=B0ng?= Date: Thu, 2 Oct 2025 14:01:40 +0700 Subject: [PATCH] feat(ui): add close button --- .../vibecoders/moongazer/managers/Assets.java | 17 ++++++++++++- .../moongazer/scenes/SettingsScene.java | 4 +-- .../moongazer/ui/UICloseButton.java | 24 ++++++++++++++++++ app/src/main/resources/textures/ui/close.png | Bin 0 -> 2659 bytes .../resources/textures/ui/close_clicked.png | Bin 0 -> 2309 bytes .../resources/textures/ui/close_hover.png | Bin 0 -> 3454 bytes 6 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/org/vibecoders/moongazer/ui/UICloseButton.java create mode 100644 app/src/main/resources/textures/ui/close.png create mode 100644 app/src/main/resources/textures/ui/close_clicked.png create mode 100644 app/src/main/resources/textures/ui/close_hover.png diff --git a/app/src/main/java/org/vibecoders/moongazer/managers/Assets.java b/app/src/main/java/org/vibecoders/moongazer/managers/Assets.java index d10f8d2..5f24b37 100644 --- a/app/src/main/java/org/vibecoders/moongazer/managers/Assets.java +++ b/app/src/main/java/org/vibecoders/moongazer/managers/Assets.java @@ -25,6 +25,7 @@ public class Assets { private static final HashMap loadedFiles = new HashMap<>(); private static boolean startLoadAll = false; private static boolean loadedAll = false; + private static Thread loadingThread = null; private static Texture textureWhite; private static Texture textureBlack; @@ -119,8 +120,14 @@ public class Assets { assetManager.load("textures/ui/UI_Gcg_Icon_Close.png", Texture.class); assetManager.load("textures/ui/arrow-button-left.png", Texture.class); assetManager.load("textures/ui/arrow-button-right.png", Texture.class); + assetManager.load("textures/ui/close.png", Texture.class); + assetManager.load("textures/ui/close_hover.png", Texture.class); + assetManager.load("textures/ui/close_clicked.png", Texture.class); // "Load" unsupported file types as FileHandle - loadAny("videos/main_menu_background.webm"); + loadingThread = new Thread(() -> { + loadAny("videos/main_menu_background.webm"); + }); + loadingThread.start(); } public static boolean isLoadedAll() { @@ -133,6 +140,14 @@ public class Assets { public static void waitUntilLoaded() { assetManager.finishLoading(); + if (loadingThread != null) { + try { + loadingThread.join(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + loadingThread = null; + } if (startLoadAll) { loadedAll = true; } diff --git a/app/src/main/java/org/vibecoders/moongazer/scenes/SettingsScene.java b/app/src/main/java/org/vibecoders/moongazer/scenes/SettingsScene.java index a2c385a..9564d9e 100644 --- a/app/src/main/java/org/vibecoders/moongazer/scenes/SettingsScene.java +++ b/app/src/main/java/org/vibecoders/moongazer/scenes/SettingsScene.java @@ -16,7 +16,7 @@ import org.vibecoders.moongazer.Game; import org.vibecoders.moongazer.State; import org.vibecoders.moongazer.Settings; import org.vibecoders.moongazer.managers.Assets; -import org.vibecoders.moongazer.ui.UIImageButton; +import org.vibecoders.moongazer.ui.UICloseButton; import org.vibecoders.moongazer.ui.UITextButton; import java.util.HashMap; @@ -102,7 +102,7 @@ public class SettingsScene extends Scene { mainPanel.row(); // Back button - UIImageButton backButton = new UIImageButton("textures/ui/UI_Gcg_Icon_Close.png"); + UICloseButton backButton = new UICloseButton(); backButton.setSize(40, 40); backButton.setPosition(Gdx.graphics.getWidth() - 80, Gdx.graphics.getHeight() - 80); backButton.onClick(() -> { diff --git a/app/src/main/java/org/vibecoders/moongazer/ui/UICloseButton.java b/app/src/main/java/org/vibecoders/moongazer/ui/UICloseButton.java new file mode 100644 index 0000000..32d7148 --- /dev/null +++ b/app/src/main/java/org/vibecoders/moongazer/ui/UICloseButton.java @@ -0,0 +1,24 @@ +package org.vibecoders.moongazer.ui; + +import com.badlogic.gdx.graphics.Texture; +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; +import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; +import org.vibecoders.moongazer.managers.Assets; + +public class UICloseButton extends UIButton { + public UICloseButton() { + Texture closeTexture = Assets.getAsset("textures/ui/close.png", Texture.class); + Texture closeHoverTexture = Assets.getAsset("textures/ui/close_hover.png", Texture.class); + Texture closeClickTexture = Assets.getAsset("textures/ui/close_clicked.png", Texture.class); + TextureRegionDrawable drawable = new TextureRegionDrawable(new TextureRegion(closeTexture)); + TextureRegionDrawable hoverDrawable = new TextureRegionDrawable(new TextureRegion(closeHoverTexture)); + TextureRegionDrawable clickDrawable = new TextureRegionDrawable(new TextureRegion(closeClickTexture)); + ImageButton.ImageButtonStyle style = new ImageButton.ImageButtonStyle(); + style.imageUp = drawable; + style.imageDown = clickDrawable; + style.imageOver = hoverDrawable; + this.button = new ImageButton(style); + this.actor = button; + } +} diff --git a/app/src/main/resources/textures/ui/close.png b/app/src/main/resources/textures/ui/close.png new file mode 100644 index 0000000000000000000000000000000000000000..fa239b9b2b86d79b9504b35470b4bb6c621fcd35 GIT binary patch literal 2659 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 Rbc+B0002ovPDHLkV1o0q`V;^F literal 0 HcmV?d00001 diff --git a/app/src/main/resources/textures/ui/close_clicked.png b/app/src/main/resources/textures/ui/close_clicked.png new file mode 100644 index 0000000000000000000000000000000000000000..a6fbfe95b55b9e4dce1643044a99d28a053e1fd5 GIT binary patch literal 2309 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 literal 0 HcmV?d00001