From 4b5584dca9b8ca8e96d816343753ec4afd0d6ea8 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Tue, 15 Feb 2022 11:30:36 +0800 Subject: [PATCH] #CloseScreen --- .../src/main/java/forge/adventure/Main.java | 46 +++++++ forge-gui-mobile-dev/src/forge/app/Main.java | 46 +++++++ forge-gui-mobile/src/forge/Forge.java | 20 +++- .../src/forge/screens/ClosingScreen.java | 112 ++++++++++++++++++ 4 files changed, 220 insertions(+), 4 deletions(-) create mode 100644 forge-gui-mobile/src/forge/screens/ClosingScreen.java diff --git a/forge-adventure/src/main/java/forge/adventure/Main.java b/forge-adventure/src/main/java/forge/adventure/Main.java index c442f84192c..9abf9637e7f 100644 --- a/forge-adventure/src/main/java/forge/adventure/Main.java +++ b/forge-adventure/src/main/java/forge/adventure/Main.java @@ -4,6 +4,8 @@ import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Application; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Clipboard; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3WindowListener; import com.badlogic.gdx.graphics.glutils.HdpiMode; import forge.Forge; import forge.adventure.util.Config; @@ -47,6 +49,50 @@ public class Main { } config.setTitle("Forge Adventure Mobile"); config.setWindowIcon(Config.instance().getFilePath("forge-adventure.png")); + config.setWindowListener(new Lwjgl3WindowListener() { + @Override + public void created(Lwjgl3Window lwjgl3Window) { + + } + + @Override + public void iconified(boolean b) { + + } + + @Override + public void maximized(boolean b) { + + } + + @Override + public void focusLost() { + + } + + @Override + public void focusGained() { + + } + + @Override + public boolean closeRequested() { + //use the device adpater to exit properly + if (Forge.safeToClose) + Forge.exit(true); + return false; + } + + @Override + public void filesDropped(String[] strings) { + + } + + @Override + public void refreshRequested() { + + } + }); new Lwjgl3Application(start, config); diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index f16a582797a..5ede639f42d 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -9,6 +9,8 @@ import java.io.OutputStream; import javax.imageio.ImageIO; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3Window; +import com.badlogic.gdx.backends.lwjgl3.Lwjgl3WindowListener; import com.badlogic.gdx.graphics.glutils.HdpiMode; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; @@ -106,6 +108,50 @@ public class Main { config.setAutoIconify(true); //fix alt-tab when running fullscreen } config.setTitle("Forge"); + config.setWindowListener(new Lwjgl3WindowListener() { + @Override + public void created(Lwjgl3Window lwjgl3Window) { + + } + + @Override + public void iconified(boolean b) { + + } + + @Override + public void maximized(boolean b) { + + } + + @Override + public void focusLost() { + + } + + @Override + public void focusGained() { + + } + + @Override + public boolean closeRequested() { + //use the device adpater to exit properly + if (Forge.safeToClose) + Forge.exit(true); + return false; + } + + @Override + public void filesDropped(String[] strings) { + + } + + @Override + public void refreshRequested() { + + } + }); if (desktopMode) config.setHdpiMode(HdpiMode.Logical); diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 3276514ee5b..35233c8f968 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -31,6 +31,7 @@ import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; +import forge.screens.ClosingScreen; import forge.screens.FScreen; import forge.screens.SplashScreen; import forge.screens.home.HomeScreen; @@ -66,8 +67,10 @@ public class Forge implements ApplicationListener { private static FrameRate frameRate; private static FScreen currentScreen; protected static SplashScreen splashScreen; + protected static ClosingScreen closingScreen; public static KeyInputAdapter keyInputAdapter; private static boolean exited; + public static boolean safeToClose = false; private static int continuousRenderingCount = 1; //initialize to 1 since continuous rendering is the default private static final Deque Dscreens = new ArrayDeque<>(); private static boolean textureFiltering = false; @@ -334,6 +337,7 @@ public class Forge implements ApplicationListener { } //start background music SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); + Forge.safeToClose = true; } }); } @@ -452,7 +456,7 @@ public class Forge implements ApplicationListener { public void run(Boolean result) { if (result) { exited = true; - deviceAdapter.restart(); + exitAnimation(true); } } }; @@ -477,7 +481,7 @@ public class Forge implements ApplicationListener { public void run(Boolean result) { if (result) { exited = true; - deviceAdapter.exit(); + exitAnimation(false); } } }; @@ -595,7 +599,9 @@ public class Forge implements ApplicationListener { Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the screen. FContainer screen = currentScreen; - if (screen == null) { + if (closingScreen != null) { + screen = closingScreen; + } else if (screen == null) { screen = splashScreen; if (screen == null) { if (isMobileAdventureMode) { @@ -801,6 +807,12 @@ public class Forge implements ApplicationListener { return true; } + static void exitAnimation(boolean restart) { + if (closingScreen == null) { + closingScreen = new ClosingScreen(restart); + } + } + public static abstract class KeyInputAdapter { public abstract FDisplayObject getOwner(); public abstract boolean allowTouchInput(); @@ -869,7 +881,7 @@ public class Forge implements ApplicationListener { } if(keyCode == Keys.BACK){ if (destroyThis) - deviceAdapter.exit(); + exitAnimation(false); else if(onHomeScreen() && isLandscapeMode()) back(); } diff --git a/forge-gui-mobile/src/forge/screens/ClosingScreen.java b/forge-gui-mobile/src/forge/screens/ClosingScreen.java new file mode 100644 index 00000000000..003e832839f --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/ClosingScreen.java @@ -0,0 +1,112 @@ +package forge.screens; + +import forge.Forge; +import forge.Graphics; +import forge.animation.ForgeAnimation; +import forge.assets.FSkin; +import forge.assets.FSkinImage; +import forge.assets.FSkinTexture; +import forge.toolbox.FContainer; + +public class ClosingScreen extends FContainer { + private BGAnimation bgAnimation; + private StaticAnimation staticAnimation; + private boolean restart = false; + private boolean drawStatic = false; + + public ClosingScreen(boolean restart0) { + bgAnimation = new BGAnimation(); + staticAnimation = new StaticAnimation(); + restart = restart0; + } + + @Override + protected void doLayout(float width, float height) { + + } + + private class StaticAnimation extends ForgeAnimation { + float DURATION = 0.8f; + private float progress = 0; + + public void drawBackgroud(Graphics g) { + float percentage = progress / DURATION; + float oldAlpha = g.getfloatAlphaComposite(); + if (percentage < 0) { + percentage = 0; + } else if (percentage > 1) { + percentage = 1; + } + g.setAlphaComposite(1-percentage); + g.drawImage(FSkinTexture.BG_TEXTURE, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight()); + g.setAlphaComposite(oldAlpha); + float xmod = Forge.getScreenHeight() > 1000 ? 1.5f : Forge.getScreenHeight() > 800 ? 1.3f : 1f; + if (FSkin.hdLogo != null) { + g.drawImage(FSkin.hdLogo, Forge.getScreenWidth()/2 - (FSkin.hdLogo.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkin.hdLogo.getHeight()*xmod)/1.5f, FSkin.hdLogo.getWidth()*xmod, FSkin.hdLogo.getHeight()*xmod); + } else { + g.drawImage(FSkinImage.LOGO,Forge.getScreenWidth()/2 - (FSkinImage.LOGO.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkinImage.LOGO.getHeight()*xmod)/1.5f, FSkinImage.LOGO.getWidth()*xmod, FSkinImage.LOGO.getHeight()*xmod); + } + } + + @Override + protected boolean advance(float dt) { + progress += dt; + return progress < DURATION; + } + + @Override + protected void onEnd(boolean endingAll) { + if (restart) + Forge.getDeviceAdapter().restart(); + else + Forge.getDeviceAdapter().exit(); + + } + } + private class BGAnimation extends ForgeAnimation { + float DURATION = 0.6f; + private float progress = 0; + + public void drawBackground(Graphics g) { + float percentage = progress / DURATION; + float oldAlpha = g.getfloatAlphaComposite(); + if (percentage < 0) { + percentage = 0; + } else if (percentage > 1) { + percentage = 1; + } + g.setAlphaComposite(percentage); + g.drawImage(FSkinTexture.BG_TEXTURE, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight()); + g.setAlphaComposite(oldAlpha); + float xmod = Forge.getScreenHeight() > 1000 ? 1.5f : Forge.getScreenHeight() > 800 ? 1.3f : 1f; + xmod *= 21-(20*percentage); + if (FSkin.hdLogo != null) { + g.drawImage(FSkin.hdLogo, Forge.getScreenWidth()/2 - (FSkin.hdLogo.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkin.hdLogo.getHeight()*xmod)/1.5f, FSkin.hdLogo.getWidth()*xmod, FSkin.hdLogo.getHeight()*xmod); + } else { + g.drawImage(FSkinImage.LOGO,Forge.getScreenWidth()/2 - (FSkinImage.LOGO.getWidth()*xmod)/2, Forge.getScreenHeight()/2 - (FSkinImage.LOGO.getHeight()*xmod)/1.5f, FSkinImage.LOGO.getWidth()*xmod, FSkinImage.LOGO.getHeight()*xmod); + } + } + + @Override + protected boolean advance(float dt) { + progress += dt; + return progress < DURATION; + } + + @Override + protected void onEnd(boolean endingAll) { + drawStatic = true; + } + } + + @Override + protected void drawBackground(Graphics g) { + if (drawStatic) { + staticAnimation.start(); + staticAnimation.drawBackgroud(g); + return; + } + bgAnimation.start(); + bgAnimation.drawBackground(g); + } +}