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