From 7d6104387d7f5a99a6d9c01e011c2cc7e9312cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz> Date: Mon, 9 Feb 2015 15:42:53 +0100 Subject: [PATCH] #7 Tablexia abstract screen lifecycle * screen loading transactions delay * screen fully visible handler --- .../cz/nic/tablexia/TablexiaApplication.java | 85 ++++++++++++------- .../game/games/robbery/DebugScreen.java | 2 +- .../game/games/robbery/GameScreen.java | 4 +- .../game/games/robbery/RuleScreen.java | 7 +- .../screen/AbstractTablexiaScreen.java | 79 +++++++++++++---- .../cz/nic/tablexia/screen/LoaderScreen.java | 4 +- .../tablexia/screen/about/AboutScreen.java | 2 +- .../encyclopedia/EncyclopediaScreen.java | 2 +- .../screen/gamemenu/GameMenuScreen.java | 5 +- .../screen/halloffame/HallOfFameScreen.java | 2 +- .../screen/statistics/StatisticsScreen.java | 6 +- 11 files changed, 134 insertions(+), 64 deletions(-) diff --git a/core/src/cz/nic/tablexia/TablexiaApplication.java b/core/src/cz/nic/tablexia/TablexiaApplication.java index c843bad35..5959f6491 100644 --- a/core/src/cz/nic/tablexia/TablexiaApplication.java +++ b/core/src/cz/nic/tablexia/TablexiaApplication.java @@ -12,14 +12,15 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; -import com.badlogic.gdx.graphics.Pixmap.Format; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Stage; +import cz.nic.tablexia.graphics.ColorTexture; import cz.nic.tablexia.screen.AbstractTablexiaScreen; +import cz.nic.tablexia.screen.AbstractTablexiaScreen.ScreenLoadingListener; /** * Abstract Tablexia libGDX application listener with screen transactions implementation. @@ -144,7 +145,7 @@ public abstract class TablexiaApplication implements ApplicationListener { * @param newScreen new screen to change for * @param screenTransaction screen transaction type */ - public void setScreen (AbstractTablexiaScreen newScreen, ScreenTransaction screenTransaction) { + public void setScreen (final AbstractTablexiaScreen newScreen, ScreenTransaction screenTransaction) { if (screenTransaction == null) { setScreen(newScreen); } else { @@ -165,6 +166,13 @@ public abstract class TablexiaApplication implements ApplicationListener { public void run() { processLastScreen(lastScreen); } + }, + + new Runnable() { + @Override + public void run() { + newScreen.performScreenVisible(); + } }); } } @@ -205,7 +213,7 @@ public abstract class TablexiaApplication implements ApplicationListener { FADE (new FadeAnimation()); private interface ScreenTransactionImplementation { - public void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, Runnable finishHandler); + public void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable newScreenHandler, Runnable lastScreenHandler, Runnable finishHandler); } private ScreenTransactionImplementation screenTransactionImplementation; @@ -214,8 +222,8 @@ public abstract class TablexiaApplication implements ApplicationListener { this.screenTransactionImplementation = screenTransactionImplementation; } - private void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, Runnable finishHandler) { - screenTransactionImplementation.processTransaction(stage, lastScreen, newScreen, startHandler, finishHandler); + private void processTransaction(Stage stage, AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable newScreenHandler, Runnable lastScreenHandler, Runnable finishHandler) { + screenTransactionImplementation.processTransaction(stage, lastScreen, newScreen, newScreenHandler, lastScreenHandler, finishHandler); } } @@ -225,35 +233,46 @@ public abstract class TablexiaApplication implements ApplicationListener { protected float newScreenMoveTo = 0; protected float lastScreenMoveTo = Gdx.graphics.getWidth(); - public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, final Runnable finishHandler) { - int transactionSpeed = 2; - if (lastScreen != null) { - lastScreen.addAction(sequence(moveTo(lastScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out), - run(finishHandler))); - } - if (newScreen != null) { - newScreen.setPosition(newScreenMoveFrom, 0); - newScreen.addAction(moveTo(newScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out)); - startHandler.run(); - } + @Override + public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, final AbstractTablexiaScreen newScreen, Runnable newScreenHandler, final Runnable lastScreenHandler, final Runnable finishHandler) { + final int transactionSpeed = 2; + newScreen.setLoadingListener(new ScreenLoadingListener() { + + @Override + public void loadingComplete() { + newScreen.resetLoadingListener(); + if (lastScreen != null) { + lastScreen.addAction(sequence(moveTo(lastScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out), + run(lastScreenHandler))); + } + if (newScreen != null) { + newScreen.setPosition(newScreenMoveFrom, 0); + newScreen.addAction(sequence(moveTo(newScreenMoveTo, 0, transactionSpeed, Interpolation.pow4Out), + run(finishHandler))); + } + } + }); + newScreenHandler.run(); } } private static class MoveLeftAnimation extends MoveRightAnimation { - public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable startHandler, final Runnable finishHandler) { + @Override + public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, AbstractTablexiaScreen newScreen, Runnable newScreenHandler, final Runnable lastScreenHandler, final Runnable finishHandler) { newScreenMoveFrom = Gdx.graphics.getWidth(); newScreenMoveTo = 0; lastScreenMoveTo = -Gdx.graphics.getWidth(); - super.processTransaction(stage, lastScreen, newScreen, startHandler, finishHandler); + super.processTransaction(stage, lastScreen, newScreen, newScreenHandler, lastScreenHandler, finishHandler); } } private static class FadeAnimation implements cz.nic.tablexia.TablexiaApplication.ScreenTransaction.ScreenTransactionImplementation { - public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, final AbstractTablexiaScreen newScreen, final Runnable startHandler, final Runnable finishHandler) { - int transactionSpeed = 1; - final Texture texture = new Texture(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Format.RGB565); + @Override + public void processTransaction(Stage stage, final AbstractTablexiaScreen lastScreen, final AbstractTablexiaScreen newScreen, final Runnable newScreenHandler, final Runnable lastScreenHandler, final Runnable finishHandler) { + final int transactionSpeed = 1; + final Texture texture = new ColorTexture(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Color.BLACK); final Actor screenDimmer = new Actor(){ public void draw(Batch batch, float parentAlpha) { @@ -262,16 +281,24 @@ public abstract class TablexiaApplication implements ApplicationListener { batch.setColor(Color.WHITE); }; }; + newScreen.setLoadingListener(new ScreenLoadingListener() { + + @Override + public void loadingComplete() { + newScreen.resetLoadingListener(); + screenDimmer.addAction(sequence(fadeOut(transactionSpeed, Interpolation.pow4In), + run(finishHandler), + run(new Runnable() { + public void run() { + screenDimmer.remove(); + } + }))); + } + }); screenDimmer.addAction(alpha(0)); screenDimmer.addAction(sequence(fadeIn(transactionSpeed, Interpolation.pow4Out), - run(startHandler), - run(finishHandler), - fadeOut(transactionSpeed, Interpolation.pow4In), - run(new Runnable() { - public void run() { - screenDimmer.remove(); - } - }))); + run(newScreenHandler), + run(lastScreenHandler))); stage.addActor(screenDimmer); } } diff --git a/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java b/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java index 5b9fbb3bf..1257e8c00 100644 --- a/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java +++ b/core/src/cz/nic/tablexia/game/games/robbery/DebugScreen.java @@ -40,7 +40,7 @@ public class DebugScreen extends AbstractTablexiaScreen { } @Override - protected void showScreen() { + protected void screenLoaded() { displayAllCreatures(RobberyDataManager.getInstance().getResult().getCreatures(), getStage()); } diff --git a/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java b/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java index ac98cad6b..4aca56691 100644 --- a/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java +++ b/core/src/cz/nic/tablexia/game/games/robbery/GameScreen.java @@ -248,7 +248,7 @@ public class GameScreen extends AbstractTablexiaScreen { private int creatureNumber = -1; @Override - public void showScreen() { + public void screenLoaded() { super.show(); getStage().addActor(new GameBackground()); @@ -264,7 +264,7 @@ public class GameScreen extends AbstractTablexiaScreen { } @Override - public void resizeScreen(int width, int height) { + public void screenResized(int width, int height) { InfoItem.calculateDimensions(width, height); prepareCreaturePositions(width, height); } diff --git a/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java b/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java index 76ebbc549..cc1145d12 100644 --- a/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java +++ b/core/src/cz/nic/tablexia/game/games/robbery/RuleScreen.java @@ -90,7 +90,7 @@ public class RuleScreen extends AbstractTablexiaScreen { } @Override - public void showScreen() { + public void screenLoaded() { super.show(); if (!loadingComplete) { @@ -265,7 +265,7 @@ public class RuleScreen extends AbstractTablexiaScreen { } @Override - public void resizeScreen(int width, int height) { + public void screenResized(int width, int height) { if (loadingComplete) { background.setSize(width, height); paper.setSize(width, height); @@ -275,8 +275,7 @@ public class RuleScreen extends AbstractTablexiaScreen { } @Override - public void dispose() { - super.dispose(); + public void screenDisposed() { //TODO move to gameEnd method RobberyTextureManager.getInstance().dispose(); RobberyDataManager.getInstance().dispose(); diff --git a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java index 95b98e246..22ee1c4b8 100644 --- a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java +++ b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java @@ -20,6 +20,7 @@ import com.badlogic.gdx.utils.viewport.ScreenViewport; import cz.nic.tablexia.game.loader.AbstractDataManager; import cz.nic.tablexia.loader.IApplicationLoader; +import cz.nic.tablexia.util.Log; public abstract class AbstractTablexiaScreen extends ScreenAdapter { @@ -49,23 +50,45 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter { } } - private Stage stage; - private AssetManager textureManager; - private TextManager textManager; - private boolean loadingComplete; - private boolean loadingStarted; + public static interface ScreenLoadingListener { + void loadingComplete(); + } + + private Stage stage; + private AssetManager textureManager; + private TextManager textManager; + private ScreenLoadingListener screenLoadingListener; + private boolean loadingComplete; + private boolean loadingStarted; + public AbstractTablexiaScreen() { stage = prepareStage(); textureManager = new AssetManager(); textManager = new TextManager(); - loadingComplete = false; loadingStarted = false; } +//////////////////////////// LOADING LISTENER + + private void notifyLoadingCompleteListeners() { + if (screenLoadingListener != null) { + screenLoadingListener.loadingComplete(); + } + } + + public void setLoadingListener(ScreenLoadingListener listener) { + screenLoadingListener = listener; + } + + public void resetLoadingListener() { + screenLoadingListener = null; + } + + //////////////////////////// STAGE private Stage prepareStage() { @@ -101,7 +124,7 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter { super.resize(width, height); stage.getViewport().update(width, height, true); if (loadingComplete) { - resizeScreen(width, height); + performScreenResized(width, height); } } @@ -112,32 +135,54 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter { if (!textureManager.update()) return; if (!textManager.update()) return; loadingComplete = true; - showScreen(); - resizeScreen((int)stage.getWidth(), (int)stage.getHeight()); + performScreenLoaded(); + performScreenResized((int)stage.getWidth(), (int)stage.getHeight()); + notifyLoadingCompleteListeners(); } - } else { + } else { stage.act(Gdx.graphics.getDeltaTime()); stage.draw(); } }; @Override - public void dispose() { + public final void dispose() { stage.dispose(); textureManager.dispose(); textManager.dispose(); + performScreenDisposed(); } //////////////////////////// TABLEXIA SCREEN LIFECYCLE - protected abstract void showScreen(); + private final void performScreenLoaded() { + Log.info(getClass().getName(), "[ ------- Screen Loaded ------- ]"); + screenLoaded(); + } - protected void resizeScreen(int width, int height) {}; + public final void performScreenVisible() { + Log.info(getClass().getName(), "[ ------- Screen Visible ------- ]"); + screenVisible(); + } + + private final void performScreenResized(int width, int height) { + Log.info(getClass().getName(), "[ ------- Screen Resized ------- ]"); + screenResized(width, height); + } + + private final void performScreenDisposed() { + Log.info(getClass().getName(), "[ ------- Screen Disposed ------- ]"); + screenDisposed(); + } - protected void prepareTextureAssetNames(List<String> texturesFileNames) {} + protected void screenLoaded() {}; + protected void screenVisible() {}; + protected void screenResized(int width, int height) {}; + protected void screenDisposed() {}; - protected String prepareTextResourcesAssetName() { + protected void prepareScreenTextureAssetNames(List<String> texturesFileNames) {} + protected String prepareScreenTextResourcesAssetName() { return null; } @@ -146,14 +191,14 @@ public abstract class AbstractTablexiaScreen extends ScreenAdapter { private void startTextureLoader() { List<String> texturesFileNames = new ArrayList<String>(); - prepareTextureAssetNames(texturesFileNames); + prepareScreenTextureAssetNames(texturesFileNames); for (String textureFileName : texturesFileNames) { textureManager.load(textureFileName, Texture.class); } } private void startTextLoader() { - textManager.load(new Locale("cs", "CZ"), prepareTextResourcesAssetName()); + textManager.load(new Locale("cs", "CZ"), prepareScreenTextResourcesAssetName()); } diff --git a/core/src/cz/nic/tablexia/screen/LoaderScreen.java b/core/src/cz/nic/tablexia/screen/LoaderScreen.java index 5c9472de4..6816c7bb2 100644 --- a/core/src/cz/nic/tablexia/screen/LoaderScreen.java +++ b/core/src/cz/nic/tablexia/screen/LoaderScreen.java @@ -31,13 +31,13 @@ public class LoaderScreen extends AbstractTablexiaScreen { } @Override - protected void showScreen() { + protected void screenLoaded() { background = new LoaderBackground(); getStage().addActor(background); } @Override - public void resizeScreen(int width, int height) { + public void screenResized(int width, int height) { background.setSize(width, height); } diff --git a/core/src/cz/nic/tablexia/screen/about/AboutScreen.java b/core/src/cz/nic/tablexia/screen/about/AboutScreen.java index ab9f93857..acca98915 100644 --- a/core/src/cz/nic/tablexia/screen/about/AboutScreen.java +++ b/core/src/cz/nic/tablexia/screen/about/AboutScreen.java @@ -12,7 +12,7 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen; public class AboutScreen extends AbstractTablexiaScreen { @Override - protected void showScreen() { + protected void screenLoaded() { Label label = new Label(getClass().getSimpleName(), new LabelStyle(ApplicationFontManager.getInstance().get(ApplicationFontManager.FONT_ROBOTO_REGULAR, BitmapFont.class), Color.WHITE)); Table table = new Table(); table.add(label); diff --git a/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java b/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java index dfb70f367..f221d6fa2 100644 --- a/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java +++ b/core/src/cz/nic/tablexia/screen/encyclopedia/EncyclopediaScreen.java @@ -12,7 +12,7 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen; public class EncyclopediaScreen extends AbstractTablexiaScreen { @Override - protected void showScreen() { + protected void screenLoaded() { Label label = new Label(getClass().getSimpleName(), new LabelStyle(ApplicationFontManager.getInstance().get(ApplicationFontManager.FONT_ROBOTO_REGULAR, BitmapFont.class), Color.WHITE)); Table table = new Table(); table.add(label); diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java index 6f7c65339..c9288c651 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java @@ -31,14 +31,13 @@ public class GameMenuScreen extends AbstractTablexiaScreen { } @Override - protected void showScreen() { + protected void screenLoaded() { background = new GameMenuBackground(); getStage().addActor(background); } @Override - public void resizeScreen(int width, int height) { + public void screenResized(int width, int height) { background.setSize(width, height); } - } diff --git a/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java b/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java index 7effc96ae..e64440f6a 100644 --- a/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java +++ b/core/src/cz/nic/tablexia/screen/halloffame/HallOfFameScreen.java @@ -12,7 +12,7 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen; public class HallOfFameScreen extends AbstractTablexiaScreen { @Override - protected void showScreen() { + protected void screenLoaded() { Label label = new Label(getClass().getSimpleName(), new LabelStyle(ApplicationFontManager.getInstance().get(ApplicationFontManager.FONT_ROBOTO_REGULAR, BitmapFont.class), Color.WHITE)); Table table = new Table(); table.add(label); diff --git a/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java b/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java index 5f8898d02..70b1ec942 100644 --- a/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java +++ b/core/src/cz/nic/tablexia/screen/statistics/StatisticsScreen.java @@ -22,12 +22,12 @@ public class StatisticsScreen extends AbstractTablexiaScreen { private Container<Label> backgroundLayout; @Override - protected void prepareTextureAssetNames(List<String> texturesFileNames) { + protected void prepareScreenTextureAssetNames(List<String> texturesFileNames) { texturesFileNames.add(BACKGROUND_TEXTURE); } @Override - protected void showScreen() { + protected void screenLoaded() { backgroundLayout = new Container<Label>(); backgroundLayout.setBackground(new TextureRegionDrawable(new TextureRegion(getTexture(BACKGROUND_TEXTURE)))); @@ -40,7 +40,7 @@ public class StatisticsScreen extends AbstractTablexiaScreen { } @Override - protected void resizeScreen(int width, int height) { + protected void screenResized(int width, int height) { backgroundLayout.setBounds(0, 0, getStage().getWidth(), getStage().getHeight()); } -- GitLab