From c8ecd105007aee7417c2fdb1d7954ccbd38e39d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz> Date: Wed, 28 Jan 2015 16:18:57 +0100 Subject: [PATCH] #5 Game screens transactions * FADE transaction * MOVE_RIGHT transaction --- core/src/cz/nic/tablexia/TablexiaGame.java | 161 ++++++++++++++++++ core/src/cz/nic/tablexia/TablexiaLibGDX.java | 17 +- .../cz/nic/tablexia/screen/DebugScreen.java | 20 +-- .../cz/nic/tablexia/screen/GameScreen.java | 52 ++---- .../nic/tablexia/screen/TablexiaScreen.java | 53 ++++++ 5 files changed, 245 insertions(+), 58 deletions(-) create mode 100644 core/src/cz/nic/tablexia/TablexiaGame.java create mode 100644 core/src/cz/nic/tablexia/screen/TablexiaScreen.java diff --git a/core/src/cz/nic/tablexia/TablexiaGame.java b/core/src/cz/nic/tablexia/TablexiaGame.java new file mode 100644 index 000000000..9c5495c81 --- /dev/null +++ b/core/src/cz/nic/tablexia/TablexiaGame.java @@ -0,0 +1,161 @@ +package cz.nic.tablexia; + +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.alpha; +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.fadeIn; +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.fadeOut; +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.moveTo; +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.run; +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.sequence; + +import com.badlogic.gdx.ApplicationListener; +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.graphics.Color; +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.screen.TablexiaScreen; + +public abstract class TablexiaGame implements ApplicationListener { + + public enum ScreenTransaction { + + MOVE_RIGHT(new ScreenTransactionImplementation() { + public void processTransaction(Stage stage, final TablexiaScreen lastScreen, TablexiaScreen newScreen, final Runnable finishHandler) { + int transactionSpeed = 2; + if (lastScreen != null) { + lastScreen.addAction(sequence(moveTo(Gdx.graphics.getWidth(), 0, transactionSpeed, Interpolation.pow4Out), + run(finishHandler))); + } + if (newScreen != null) { + newScreen.setPosition(-Gdx.graphics.getWidth(), 0); + newScreen.addAction(moveTo(0, 0, transactionSpeed, Interpolation.pow4Out)); + ScreenTransaction.prepareNewScreen(newScreen); + } + } + }), + + FADE(new ScreenTransactionImplementation() { + public void processTransaction(Stage stage, final TablexiaScreen lastScreen, final TablexiaScreen newScreen, final Runnable finishHandler) { + int transactionSpeed = 1; + final Texture texture = new Texture(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), Format.RGB565); + final Actor screenDimmer = new Actor(){ + + public void draw(Batch batch, float parentAlpha) { + batch.setColor(getColor()); + batch.draw(texture, 0, 0); + batch.setColor(Color.WHITE); + }; + }; + screenDimmer.addAction(alpha(0)); + screenDimmer.addAction(sequence(fadeIn(transactionSpeed, Interpolation.pow4Out), + run(new Runnable(){ + + public void run() { + finishHandler.run(); + ScreenTransaction.prepareNewScreen(newScreen); + }; + + }), + fadeOut(transactionSpeed, Interpolation.pow4In), + run(new Runnable() { + public void run() { + screenDimmer.remove(); + } + }))); + stage.addActor(screenDimmer); + } + }); + + private interface ScreenTransactionImplementation { + public void processTransaction(Stage stage, TablexiaScreen lastScreen, TablexiaScreen newScreen, Runnable finishHandler); + } + + private ScreenTransactionImplementation screenTransactionImplementation; + + private ScreenTransaction(ScreenTransactionImplementation screenTransactionImplementation) { + this.screenTransactionImplementation = screenTransactionImplementation; + } + + private void processTransaction(Stage stage, TablexiaScreen lastScreen, TablexiaScreen newScreen, Runnable finishHandler) { + screenTransactionImplementation.processTransaction(stage, lastScreen, newScreen, finishHandler); + } + + private static void prepareNewScreen(TablexiaScreen newScreen) { + newScreen.show(); + newScreen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } + } + + private TablexiaScreen lastScreen; + private TablexiaScreen screen; + private Stage stage; + + @Override + public void dispose () { + if (lastScreen != null) lastScreen.hide(); + if (screen != null) screen.hide(); + } + + @Override + public void pause () { + if (lastScreen != null) lastScreen.pause(); + if (screen != null) screen.pause(); + } + + @Override + public void resume () { + if (lastScreen != null) lastScreen.resume(); + if (screen != null) screen.resume(); + } + + @Override + public void create() { + stage = new Stage(); + } + + @Override + public void render () { + if (lastScreen != null) lastScreen.render(Gdx.graphics.getDeltaTime()); + if (screen != null) screen.render(Gdx.graphics.getDeltaTime()); + stage.act(Gdx.graphics.getDeltaTime()); + stage.draw(); + } + + @Override + public void resize (int width, int height) { + if (lastScreen != null) lastScreen.resize(width, height); + if (screen != null) screen.resize(width, height); + } + + public void setScreen (TablexiaScreen screen) { + if (this.screen != null) this.screen.hide(); + this.screen = screen; + if (this.screen != null) { + this.screen.show(); + this.screen.resize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); + } + } + + public void setScreen (TablexiaScreen newScreen, ScreenTransaction screenTransaction) { + lastScreen = screen; + screen = newScreen; + screenTransaction.processTransaction(stage, lastScreen, newScreen, new Runnable() { + @Override + public void run() { + if (lastScreen != null) { + lastScreen.hide(); + lastScreen = null; + } + } + }); + } + + public TablexiaScreen getScreen () { + return screen; + } + +} diff --git a/core/src/cz/nic/tablexia/TablexiaLibGDX.java b/core/src/cz/nic/tablexia/TablexiaLibGDX.java index 005371855..8fb3e4f58 100644 --- a/core/src/cz/nic/tablexia/TablexiaLibGDX.java +++ b/core/src/cz/nic/tablexia/TablexiaLibGDX.java @@ -1,22 +1,25 @@ package cz.nic.tablexia; -import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.Screen; +import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.GL20; import cz.nic.tablexia.common.RandomAccess; import cz.nic.tablexia.difficulty.GameDifficulty; import cz.nic.tablexia.screen.GameScreen; +import cz.nic.tablexia.screen.TablexiaScreen; import cz.nic.tablexia.util.Log; import cz.nic.tablexia.util.Log.TablexiaLogLevel; -public class TablexiaLibGDX extends Game { +public class TablexiaLibGDX extends TablexiaGame { - private Screen screen; + private static final Color BACKGROUND_COLOR = new Color(0f, 0f, 0f, 1f); + + private TablexiaScreen screen; @Override public void create () { + super.create(); Log.setLoglevel(TablexiaLogLevel.DEBUG); screen = new GameScreen(); @@ -27,7 +30,7 @@ public class TablexiaLibGDX extends Game { @Override public void render () { - Gdx.gl.glClearColor(0.7f, 0.7f, 0.7f, 1f); + Gdx.gl.glClearColor(BACKGROUND_COLOR.r, BACKGROUND_COLOR.g, BACKGROUND_COLOR.b, BACKGROUND_COLOR.a); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); super.render(); @@ -35,8 +38,8 @@ public class TablexiaLibGDX extends Game { if (!BankRoberryAssetManager.getInstance().update()) return; if (!BankRoberryGameDataManager.getInstance().update()) return; - if (getScreen() != screen) { - setScreen(screen); + if (getScreen() != screen) { + setScreen(screen, ScreenTransaction.FADE); } } diff --git a/core/src/cz/nic/tablexia/screen/DebugScreen.java b/core/src/cz/nic/tablexia/screen/DebugScreen.java index 69d1be033..a7a0d1b3a 100644 --- a/core/src/cz/nic/tablexia/screen/DebugScreen.java +++ b/core/src/cz/nic/tablexia/screen/DebugScreen.java @@ -3,19 +3,16 @@ package cz.nic.tablexia.screen; import java.util.List; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.scenes.scene2d.Stage; -import com.badlogic.gdx.utils.viewport.ScreenViewport; import cz.nic.tablexia.BankRoberryAssetManager; import cz.nic.tablexia.BankRoberryGameDataManager; import cz.nic.tablexia.creature.CreatureRoot; import cz.nic.tablexia.util.Log; -public class DebugScreen extends ScreenAdapter { +public class DebugScreen extends TablexiaScreen { private enum DebugGroupColors { RED(Color.RED), @@ -41,21 +38,10 @@ public class DebugScreen extends ScreenAdapter { } } - private Stage stage; - @Override public void show() { - stage = new Stage(new ScreenViewport(), new SpriteBatch()); - displayAllCreatures(BankRoberryGameDataManager.getInstance().getResult(), stage); - } - - public void render(float delta) { - stage.draw(); - }; - - @Override - public void dispose() { - stage = null; + super.show(); + displayAllCreatures(BankRoberryGameDataManager.getInstance().getResult(), getStage()); } private void displayAllCreatures(List<CreatureRoot> creatures, Stage stage) { diff --git a/core/src/cz/nic/tablexia/screen/GameScreen.java b/core/src/cz/nic/tablexia/screen/GameScreen.java index e52d0334e..d00f13a43 100644 --- a/core/src/cz/nic/tablexia/screen/GameScreen.java +++ b/core/src/cz/nic/tablexia/screen/GameScreen.java @@ -12,26 +12,22 @@ import static com.badlogic.gdx.scenes.scene2d.actions.Actions.sequence; import java.util.List; import com.badlogic.gdx.Gdx; -import com.badlogic.gdx.ScreenAdapter; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureFilter; import com.badlogic.gdx.graphics.g2d.Batch; -import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; -import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.utils.Align; -import com.badlogic.gdx.utils.viewport.ScreenViewport; import cz.nic.tablexia.BankRoberryAssetManager; import cz.nic.tablexia.BankRoberryGameDataManager; import cz.nic.tablexia.creature.CreatureRoot; -public class GameScreen extends ScreenAdapter { +public class GameScreen extends TablexiaScreen { private class GameBackground extends Actor { @@ -118,7 +114,7 @@ public class GameScreen extends ScreenAdapter { public void draw(Batch batch, float parentAlpha) { batch.setColor(getColor()); batch.draw(texture, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation(), 0, 0, texture.getWidth(), texture.getHeight(), false, false); - batch.setColor(1f, 1f, 1f, 1f); + batch.setColor(Color.WHITE); } } @@ -179,8 +175,6 @@ public class GameScreen extends ScreenAdapter { container.infoItem.setVisible(false); infoItemLayer.addActor(container.infoItem); if (container.infoBanner != null) { - container.infoBanner.setSize(colorInfoLayer.getStage().getWidth() * COLORBANNER_WIDTH_RATIO, colorInfoLayer.getStage().getHeight()); - container.infoBanner.setPosition(colorInfoLayer.getStage().getWidth() * COLORBANNER_X_POSITION_RATIO, 0); container.infoBanner.setVisible(false); colorInfoLayer.addActor(container.infoBanner); } @@ -197,6 +191,11 @@ public class GameScreen extends ScreenAdapter { container.infoItem.setSize(container.infoItem.getWidth() * infoItemSizeRatio, container.infoItem.getHeight() * infoItemSizeRatio); container.infoItem.setPosition(infoItemPositionX - (container.infoItem.getWidth() / 2), infoItemPositionY); container.infoItem.setOrigin(Align.center); + + if (container.infoBanner != null) { + container.infoBanner.setSize(width * COLORBANNER_WIDTH_RATIO, height); + container.infoBanner.setPosition(width * COLORBANNER_X_POSITION_RATIO, 0); + } } } @@ -245,45 +244,30 @@ public class GameScreen extends ScreenAdapter { private float creatureFinishPositionX; private float creatureFinishPositionY; - private Stage stage; - private int creatureNumber = -1; @Override public void show() { - stage = new Stage(new ScreenViewport(), new SpriteBatch()); - Gdx.input.setInputProcessor(stage); - - stage.addActor(new GameBackground()); - stage.addActor(colorInfoLayer); - stage.addActor(new FloorBackground()); - stage.addActor(creatureLayer); - stage.addActor(new GameForeground()); - stage.addActor(infoItemLayer); + super.show(); + Gdx.input.setInputProcessor(getStage()); - stage.setDebugAll(true); + getStage().addActor(new GameBackground()); + getStage().addActor(colorInfoLayer); + getStage().addActor(new FloorBackground()); + getStage().addActor(creatureLayer); + getStage().addActor(new GameForeground()); + getStage().addActor(infoItemLayer); InfoItem.init(infoItemLayer, colorInfoLayer); - prepareCreaturePositions(stage.getViewport().getWorldWidth(), stage.getViewport().getWorldHeight()); + prepareCreaturePositions(getStage().getViewport().getWorldWidth(), getStage().getViewport().getWorldHeight()); showNextCreature(BankRoberryGameDataManager.getInstance().getResult()); } - public void render(float delta) { - stage.act(Gdx.graphics.getDeltaTime()); - stage.draw(); - }; - @Override public void resize(int width, int height) { super.resize(width, height); - stage.getViewport().update(width, height, true); InfoItem.calculateDimensions(width, height); - prepareCreaturePositions(stage.getViewport().getWorldWidth(), stage.getViewport().getWorldHeight()); - } - - @Override - public void dispose() { - stage = null; + prepareCreaturePositions(width, height); } private int getNumberOfMistakesInGame() { @@ -310,7 +294,7 @@ public class GameScreen extends ScreenAdapter { if ((creatureNumber < creatures.size()) && (getNumberOfMistakesInGame() < 3)) { final float duration = getCreatureMoveDurationForCreatureNumber(creatureNumber); final CreatureRoot creature = creatures.get(creatureNumber); - float creatureRatio = (stage.getHeight() * CREATURE_SIZE_RATIO) / creature.getHeight(); + float creatureRatio = (getStage().getHeight() * CREATURE_SIZE_RATIO) / creature.getHeight(); creature.setSize(creature.getWidth() * creatureRatio, creature.getHeight() * creatureRatio); creature.setOrigin(Align.center); creature.setPosition(creatureStartPositionX, creatureStartPositionY); diff --git a/core/src/cz/nic/tablexia/screen/TablexiaScreen.java b/core/src/cz/nic/tablexia/screen/TablexiaScreen.java new file mode 100644 index 000000000..c65f2f87c --- /dev/null +++ b/core/src/cz/nic/tablexia/screen/TablexiaScreen.java @@ -0,0 +1,53 @@ +package cz.nic.tablexia.screen; + +import static com.badlogic.gdx.scenes.scene2d.actions.Actions.*; + +import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.ScreenAdapter; +import com.badlogic.gdx.graphics.g2d.SpriteBatch; +import com.badlogic.gdx.scenes.scene2d.Action; +import com.badlogic.gdx.scenes.scene2d.Stage; +import com.badlogic.gdx.utils.viewport.ScreenViewport; + +public class TablexiaScreen extends ScreenAdapter { + + private Stage stage; + + public TablexiaScreen() { + stage = prepareStage(); + } + + private Stage prepareStage() { + return new Stage(new ScreenViewport(), new SpriteBatch()); + } + + public Stage getStage() { + return stage; + } + + public void setPosition(float positionX, float positionY) { + stage.addAction(moveTo(positionX, positionY)); + } + + public void addAction(Action action) { + stage.addAction(action); + } + + @Override + public void resize(int width, int height) { + super.resize(width, height); + stage.getViewport().update(width, height, true); + } + + @Override + public void render(float delta) { + stage.act(Gdx.graphics.getDeltaTime()); + stage.draw(); + }; + + @Override + public void dispose() { + stage = null; + } + +} -- GitLab