From 2d85fd845e7f0d3b9f3da0d56d11ea7f9ef1bfed Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 3 Nov 2024 15:27:30 +0800 Subject: [PATCH] update teleport animation --- .../stage/ConsoleCommandInterpreter.java | 15 ++++- .../src/forge/adventure/stage/GameHUD.java | 4 ++ .../src/forge/adventure/stage/GameStage.java | 25 ++++--- .../src/forge/screens/CoverScreen.java | 65 +++++++++++++++++++ .../src/forge/screens/TransitionScreen.java | 3 + 5 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 forge-gui-mobile/src/forge/screens/CoverScreen.java diff --git a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java index 16c37227705..65d787394ad 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java +++ b/forge-gui-mobile/src/forge/adventure/stage/ConsoleCommandInterpreter.java @@ -3,6 +3,7 @@ package forge.adventure.stage; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.utils.Array; +import forge.Forge; import forge.StaticData; import forge.adventure.character.PlayerSprite; import forge.adventure.data.BiomeData; @@ -17,7 +18,9 @@ import forge.card.ColorSet; import forge.deck.Deck; import forge.deck.DeckProxy; import forge.game.GameType; +import forge.gui.FThreads; import forge.item.PaperCard; +import forge.screens.CoverScreen; import java.util.ArrayList; import java.util.Arrays; @@ -135,8 +138,16 @@ public class ConsoleCommandInterpreter { PointOfInterest poi = Current.world().findPointsOfInterest(s[0]); if (poi == null) return "PoI " + s[0] + " not found"; - WorldStage.getInstance().setPosition(poi.getPosition()); - WorldStage.getInstance().player.playEffect(Paths.EFFECT_TELEPORT, 10); + + Forge.advFreezePlayerControls = true; + FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new CoverScreen(() -> { + Forge.advFreezePlayerControls = false; + WorldStage.getInstance().setPosition(new Vector2(poi.getPosition().x - 16f, poi.getPosition().y + 16f)); + WorldStage.getInstance().loadPOI(poi); + WorldSave.getCurrentSave().autoSave(); + Forge.clearTransitionScreen(); + //WorldStage.getInstance().player.playEffect(Paths.EFFECT_TELEPORT, 10); + }, Forge.takeScreenshot()))); return "Teleported to " + s[0] + "(" + poi.getPosition() + ")"; }); registerCommand(new String[]{"spawn", "enemy"}, s -> { diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java index b95e33725b6..d9cac81702d 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameHUD.java @@ -840,6 +840,10 @@ public class GameHUD extends Stage { debugMap = b; } + public boolean isDebugMap() { + return debugMap; + } + public void playerIdle() { if (MapStage.getInstance().isInMap()) { MapStage.getInstance().startPause(1f); diff --git a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java index 148900967b3..22dc194fa79 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/GameStage.java +++ b/forge-gui-mobile/src/forge/adventure/stage/GameStage.java @@ -53,7 +53,7 @@ import forge.deck.DeckProxy; import forge.game.GameType; import forge.gui.FThreads; import forge.gui.GuiBase; -import forge.screens.TransitionScreen; +import forge.screens.CoverScreen; import forge.util.MyRandom; import java.util.HashMap; @@ -468,13 +468,18 @@ public abstract class GameStage extends Stage { } if (keycode == Input.Keys.F2) { - TileMapScene S = TileMapScene.instance(); - PointOfInterestData P = PointOfInterestData.getPointOfInterest("DEBUGZONE"); - if( P != null) - { - PointOfInterest PoI = new PointOfInterest(P,new Vector2(0,0), MyRandom.getRandom()); - S.load(PoI); - Forge.switchScene(S); + // prevent going to Debug Zone by accident if Debug Map isn't enabled.. + if (GameHUD.getInstance().isDebugMap()) { + TileMapScene S = TileMapScene.instance(); + PointOfInterestData P = PointOfInterestData.getPointOfInterest("DEBUGZONE"); + if( P != null) + { + PointOfInterest PoI = new PointOfInterest(P,new Vector2(0,0), MyRandom.getRandom()); + S.load(PoI); + Forge.switchScene(S); + } + } else { + System.out.println("Enable Debug Map for Debug Zone."); } } if (keycode == Input.Keys.F11) { @@ -662,13 +667,13 @@ public abstract class GameStage extends Stage { @Override public void run() { showImageDialog(Current.generateDefeatMessage(), getDefeatBadge(), - () -> FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new TransitionScreen(() -> { + () -> FThreads.invokeInEdtNowOrLater(() -> Forge.setTransitionScreen(new CoverScreen(() -> { Forge.advFreezePlayerControls = false; WorldStage.getInstance().setPosition(new Vector2(poi.getPosition().x - 16f, poi.getPosition().y + 16f)); WorldStage.getInstance().loadPOI(poi); WorldSave.getCurrentSave().autoSave(); Forge.clearTransitionScreen(); - }, Forge.takeScreenshot(), "")))); + }, Forge.takeScreenshot())))); } }, 1f); }//Spawn shouldn't be null diff --git a/forge-gui-mobile/src/forge/screens/CoverScreen.java b/forge-gui-mobile/src/forge/screens/CoverScreen.java new file mode 100644 index 00000000000..387e4546f35 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/CoverScreen.java @@ -0,0 +1,65 @@ +package forge.screens; + +import com.badlogic.gdx.graphics.g2d.TextureRegion; +import forge.Forge; +import forge.Graphics; +import forge.animation.ForgeAnimation; +import forge.gui.FThreads; + +public class CoverScreen extends TransitionScreen { + private CoverAnimation coverAnimation; + Runnable runnable; + TextureRegion textureRegion; + + public CoverScreen(Runnable r, TextureRegion t) { + runnable = r; + textureRegion = t; + coverAnimation = new CoverAnimation(); + } + + private class CoverAnimation extends ForgeAnimation { + float DURATION = 0.6f; + private float progress = 0; + + public void drawBackground(Graphics g) { + float percentage = progress / DURATION; + if (percentage < 0) { + percentage = 0; + } else if (percentage > 1) { + percentage = 1; + } + if (textureRegion != null) { + g.drawPortalFade(textureRegion, 0, 0, Forge.getScreenWidth(), Forge.getScreenHeight(), Math.min(percentage, 1f), true); + } + } + + @Override + protected boolean advance(float dt) { + progress += dt; + return progress < DURATION; + } + + final boolean[] run = {false};//clears transition via runnable so this will reset anyway + + @Override + protected void onEnd(boolean endingAll) { + if (runnable != null) { + if (run[0]) + return; + run[0] = true; + FThreads.invokeInEdtNowOrLater(runnable); + } + } + } + + @Override + protected void drawBackground(Graphics g) { + coverAnimation.start(); + coverAnimation.drawBackground(g); + } + + @Override + protected void doLayout(float width, float height) { + + } +} diff --git a/forge-gui-mobile/src/forge/screens/TransitionScreen.java b/forge-gui-mobile/src/forge/screens/TransitionScreen.java index 177cdc5b3d7..d1ecdeaed81 100644 --- a/forge-gui-mobile/src/forge/screens/TransitionScreen.java +++ b/forge-gui-mobile/src/forge/screens/TransitionScreen.java @@ -89,6 +89,9 @@ public class TransitionScreen extends FContainer { layout = new GlyphLayout(); } + public TransitionScreen() { + } + public FProgressBar getProgressBar() { return progressBar; }