From 1ba886a111fcf61d17636e9ddd723cf56c239889 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz>
Date: Mon, 26 Jan 2015 16:54:08 +0100
Subject: [PATCH] #5 Displaying of game infographics

---
 .../nic/tablexia/BankRoberryAssetManager.java |   8 +
 .../nic/tablexia/creature/CreatureRoot.java   | 123 +------------
 .../cz/nic/tablexia/screen/GameScreen.java    | 161 +++++++++++++++---
 .../nic/tablexia/desktop/DesktopLauncher.java |   1 +
 4 files changed, 152 insertions(+), 141 deletions(-)

diff --git a/core/src/cz/nic/tablexia/BankRoberryAssetManager.java b/core/src/cz/nic/tablexia/BankRoberryAssetManager.java
index e27e21727..00feed002 100644
--- a/core/src/cz/nic/tablexia/BankRoberryAssetManager.java
+++ b/core/src/cz/nic/tablexia/BankRoberryAssetManager.java
@@ -29,6 +29,10 @@ public class BankRoberryAssetManager extends AssetManager {
 	public static final String 	SCREEN_NEWSSTAND_BOTTOM_S5		= SCREEN_PATH + "newsstand_s5_bottom.png";
 	public static final String 	SCREEN_BACKGROUND_S5			= SCREEN_PATH + "door_background_s5.png";
 	
+	public static final String 	INFOITEM_ARRESTED				= SCREEN_PATH + "arrested.png";
+	public static final String 	INFOITEM_INNOCENCE				= SCREEN_PATH + "innocence.png";
+	public static final String 	INFOITEM_ALARM					= SCREEN_PATH + "thief.png";
+	
 	
 	public static final String 	CREATURE_PATH 					= "gfx/character/";
 	
@@ -170,6 +174,10 @@ public class BankRoberryAssetManager extends AssetManager {
 		load(SCREEN_NEWSSTAND_BOTTOM_S5, Texture.class);
 		load(SCREEN_BACKGROUND_S5, Texture.class);
 		
+		load(INFOITEM_ARRESTED, Texture.class);
+		load(INFOITEM_INNOCENCE, Texture.class);
+		load(INFOITEM_ALARM, Texture.class);
+		
 		
 		load(CREATURE_BACKGROUND_TEXTURE, Texture.class);
 		
diff --git a/core/src/cz/nic/tablexia/creature/CreatureRoot.java b/core/src/cz/nic/tablexia/creature/CreatureRoot.java
index cc8d7a23d..07fbe3ec0 100644
--- a/core/src/cz/nic/tablexia/creature/CreatureRoot.java
+++ b/core/src/cz/nic/tablexia/creature/CreatureRoot.java
@@ -91,45 +91,6 @@ public class CreatureRoot extends Actor {
         }
     }
 
-//    /**
-//     * Clickable area for creature
-//     * 
-//     * @author Matyáš Latner
-//     */
-//    private class ClickableArea extends Rectangle {
-//
-//        public ClickableArea(float pX, float pY, float pWidth, float pHeight, IRectangleVertexBufferObject pRectangleVertexBufferObject) {
-//            super(pX, pY, pWidth, pHeight, pRectangleVertexBufferObject);
-//        }
-//
-//        public ClickableArea(float pX, float pY, float pWidth, float pHeight, VertexBufferObjectManager pVertexBufferObjectManager) {
-//            super(pX, pY, pWidth, pHeight, pVertexBufferObjectManager);
-//        }
-//
-//        public ClickableArea(float pX, float pY, float pWidth, float pHeight, VertexBufferObjectManager pVertexBufferObjectManager, DrawType pDrawType) {
-//            super(pX, pY, pWidth, pHeight, pVertexBufferObjectManager, pDrawType);
-//        }
-//
-//        @Override
-//        public boolean onAreaTouched(TouchEvent pSceneTouchEvent, float pTouchAreaLocalX, float pTouchAreaLocalY) {
-//            if (isClickable) {
-//                isClickable = false;
-//                if (isThief()) {
-//                    isRevealed = true;
-//                    bankovniloupezActivity.showShackles();
-//                    bankovniloupezActivity.getGameManager().setExtraInt1AndSave(bankovniloupezActivity.getGameManager().getExtraInt1() + 1);
-//                } else {
-//                    bankovniloupezActivity.showError();
-//                    bankovniloupezActivity.getGameManager().setExtraInt3AndSave(bankovniloupezActivity.getGameManager().getExtraInt3() + 1);
-//                }
-//                return true;
-//            }
-//            return false;
-//        }
-//
-//    }
-
-//    private boolean                isClickable = false;
     private boolean                	isRevealed  = false;
     private boolean                	isThief     = false;
     private int                    	groupNumber = CREATURE_GROUP_NUMBER_NOGROUP;
@@ -191,6 +152,10 @@ public class CreatureRoot extends Actor {
     public boolean isRevealed() {
         return isRevealed;
     }
+    
+    public void setRevealed(boolean isRevealed) {
+		this.isRevealed = isRevealed;
+	}
 
     /**
      * Set creature as thief.
@@ -332,86 +297,6 @@ public class CreatureRoot extends Actor {
         creatureDescriptor.setThief(isThief);
         return creatureDescriptor;
     }
-
-//    /**
-//     * Move creature from specific position to specific position
-//     * 
-//     * @param duration duration of move
-//     * @param fromX from x
-//     * @param fromY from y
-//     * @param toX to x
-//     * @param toY to y
-//     * @param fromScale start and finish scale
-//     * @param toScale middle state scale
-//     * @param firstAnimListener listener for middle state
-//     * @param secoundAnimListener listener for finish state
-//     */
-//    public void enableMove(final float duration, final float fromX, final float fromY, final float middleX, final float middleY, final float toX, final float toY, final float fromScale, final float toScale, final float finalScale, final IModifierListener<IEntity> firstAnimListener, final IModifierListener<IEntity> secoundAnimListener, final IModifierListener<IEntity> thirdAnimListener) {
-//
-//        ScaleModifier scaleModifierIn = new ScaleModifier(duration, fromScale, toScale, EaseQuartOut.getInstance());
-//        MoveModifier animationModifierIn = new MoveModifier(duration, fromX, fromY, middleX, middleY, EaseQuartOut.getInstance());
-//        animationModifierIn.addModifierListener(firstAnimListener);
-//        animationModifierIn.addModifierListener(new IModifierListener<IEntity>() {
-//
-//            @Override
-//            public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {
-//                Sound sound = ResourceManager.getInstance().getSound(getCreatureDescrition().getGender().equals(AttributeGender.FEMALE) ? ResourceManager.STEPS_FEMALE[random.nextInt(ResourceManager.STEPS_FEMALE.length)][0] : ResourceManager.STEPS_MALE[random.nextInt(ResourceManager.STEPS_MALE.length)][0]);
-//                sound.setRate((float) Math.max(0.5f, Math.min(2.0, (1.6f / duration)))); // hodnota mela být délka zvuku, ale musel jsem ji snížiy, aby zvuk nebyl příliš zrychlený
-//                sound.play();
-//            }
-//
-//            @Override
-//            public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
-//                final ScaleModifier scaleModifierOut = new ScaleModifier(duration, toScale, fromScale, EaseQuartIn.getInstance());
-//                MoveModifier animationModifierOut = new MoveModifier(duration / 2, middleX, middleY, toX, toY, EaseQuartIn.getInstance());
-//                if (secoundAnimListener != null) {
-//                    animationModifierOut.addModifierListener(secoundAnimListener);
-//                }
-//                animationModifierOut.addModifierListener(new IModifierListener<IEntity>() {
-//
-//                    @Override
-//                    public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {
-//                        Sound sound = ResourceManager.getInstance().getSound(getCreatureDescrition().getGender().equals(AttributeGender.FEMALE) ? ResourceManager.STEPS_FEMALE[random.nextInt(ResourceManager.STEPS_FEMALE.length)][1] : ResourceManager.STEPS_MALE[random.nextInt(ResourceManager.STEPS_MALE.length)][1]);
-//                        sound.setRate((float) Math.max(0.5f, Math.min(2.0, (2.0 / duration))));
-//                        sound.play();
-//                    }
-//
-//                    @Override
-//                    public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
-//                        unregisterEntityModifier(scaleModifierOut);
-//
-//                        isClickable = false;
-//                        CreatureRoot.this.setScale(finalScale);
-//                        MoveModifier animationModifierFinish = new MoveModifier(duration / 4, toX, toY, toX / 4, toY, EaseLinear.getInstance());
-//                        animationModifierFinish.addModifierListener(thirdAnimListener);
-//                        registerEntityModifier(animationModifierFinish);
-//                    }
-//                });
-//
-//                registerEntityModifier(animationModifierOut);
-//                registerEntityModifier(scaleModifierOut);
-//            }
-//        });
-//        registerEntityModifier(animationModifierIn);
-//        registerEntityModifier(scaleModifierIn);
-//    }
-
-    /**
-     * Enable clicking on this creature
-     * 
-     * @param scene current game scene
-     * @param vertexBufferObjectManager current andengine vertex buffer object
-     */
-//    public void setClickable(Scene scene, BankovniloupezActivity bankovniloupezActivity, VertexBufferObjectManager vertexBufferObjectManager) {
-//        this.bankovniloupezActivity = bankovniloupezActivity;
-//        if (!isClickable) {
-//            isClickable = true;
-//            ClickableArea clickableArea = new ClickableArea(0, 0, 200, 500, vertexBufferObjectManager);
-//            clickableArea.setColor(Color.TRANSPARENT);
-//            attachChild(clickableArea);
-//            scene.registerTouchArea(clickableArea);
-//        }
-//    }
     
 
     @Override
diff --git a/core/src/cz/nic/tablexia/screen/GameScreen.java b/core/src/cz/nic/tablexia/screen/GameScreen.java
index 4a002a75f..7db317f1e 100644
--- a/core/src/cz/nic/tablexia/screen/GameScreen.java
+++ b/core/src/cz/nic/tablexia/screen/GameScreen.java
@@ -1,5 +1,8 @@
 package cz.nic.tablexia.screen;
 
+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.parallel;
 import static com.badlogic.gdx.scenes.scene2d.actions.Actions.run;
@@ -10,6 +13,7 @@ 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;
@@ -26,10 +30,9 @@ 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 GameScreen extends ScreenAdapter {
-	
+
 	private class GameBackground extends Actor {
 		
 		private Texture backgroundTexture;
@@ -68,22 +71,113 @@ public class GameScreen extends ScreenAdapter {
 		
 	}
 	
-	private static final float 			CREATURE_SIZE_RATIO 			= 3f/5;
+	private static class GenericInfoItem extends Actor {
+		
+		private Texture texture;
+
+		public GenericInfoItem(String textureName) {
+			texture = BankRoberryAssetManager.getInstance().get(textureName, Texture.class);
+			texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
+			setSize(texture.getWidth(), texture.getHeight());
+		}
+		
+		@Override
+		public void draw(Batch batch, float parentAlpha) {
+			Color color = getColor();
+		    batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
+			batch.draw(texture, getX(), getY(), getOriginX(), getOriginY(), getWidth(), getHeight(), getScaleX(), getScaleY(), getRotation(), 0, 0, texture.getWidth(), texture.getHeight(), false, false);
+			batch.setColor(color.r, color.g, color.b, 1f);
+		}
+		
+	}
 	
-    private static final float          CREATURE_STRAT_MOVE_DURATION 	= 1.5f;
-    private static final float          CREATURE_MOVE_DURATION_STEP  	= 0.013f;
-    private static final float          CREATURE_FROM_SCALE          	= 0.1f;
-    private static final float          CREATURE_TO_SCALE            	= 1.05f;
-    private static final float          CREATURE_FINAL_SCALE         	= 0.9f;
+	private enum InfoItem {
+		
+		ARRESTED	(new GenericInfoItem(BankRoberryAssetManager.INFOITEM_ARRESTED)),
+		INNOCENCE	(new GenericInfoItem(BankRoberryAssetManager.INFOITEM_INNOCENCE)),
+		ALARM		(new GenericInfoItem(BankRoberryAssetManager.INFOITEM_ALARM));
+		
+		private final GenericInfoItem infoItem;
+
+		private InfoItem(GenericInfoItem infoItem) {
+			this.infoItem = infoItem;
+		}
+		
+		public void show() {
+			for (InfoItem container : InfoItem.values()) {
+				container.infoItem.setVisible(false);
+			}
+			infoItem.addAction(alpha(0));
+			infoItem.addAction(scaleTo(INFOITEM_INITIAL_SCALE, INFOITEM_INITIAL_SCALE));
+			infoItem.setVisible(true);
+			infoItem.addAction(parallel(fadeIn(INFOITEM_SHOW_DURATION, INFOITEM_SHOW_ALPHA_INTERPOLATION),
+										scaleTo(1f, 1f, INFOITEM_SHOW_DURATION, INFOITEM_SHOW_SCALE_INTERPOLATION)));
+		}
+		
+		public void hide() {
+			if (infoItem.isVisible()) {			
+				infoItem.addAction(sequence(parallel(fadeOut(INFOITEM_HIDE_DURATION, INFOITEM_HIDE_INTERPOLATION),
+													 scaleTo(INFOITEM_INITIAL_SCALE, INFOITEM_INITIAL_SCALE, INFOITEM_HIDE_DURATION, INFOITEM_HIDE_INTERPOLATION)),
+											run(new Runnable() {
+
+												@Override
+												public void run() {
+													infoItem.setVisible(false);
+												}
+											})));
+			}
+		}
+		
+		public static void init(Stage stage) {
+			calculateDimensions(stage.getWidth(), stage.getHeight());
+			for (InfoItem container : InfoItem.values()) {
+				container.infoItem.setVisible(false);
+				stage.addActor(container.infoItem);
+			}
+		}
+		
+		public static void calculateDimensions(float width, float height) {
+			float infoItemPositionX = width * INFOITEM_POSITION_X_RATIO;
+			float infoItemPositionY = height * INFOITEM_POSITION_Y_RATIO;
+			
+			for (InfoItem container : InfoItem.values()) {
+				float infoItemSizeRatio = (height * INFOITEM_SIZE_RATIO) / container.infoItem.getHeight();
+				
+				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);
+			}
+		}
+		
+	}
+	
+	private static final float 			INFOITEM_POSITION_Y_RATIO 			= 3f/7;
+	private static final float 			INFOITEM_POSITION_X_RATIO 			= 11f/36;
+	private static final Interpolation 	INFOITEM_HIDE_INTERPOLATION 		= Interpolation.pow4In;
+	private static final Interpolation 	INFOITEM_SHOW_ALPHA_INTERPOLATION 	= Interpolation.pow4Out;
+	private static final Interpolation 	INFOITEM_SHOW_SCALE_INTERPOLATION 	= Interpolation.swingOut;
+	private static final float 			INFOITEM_HIDE_DURATION 				= 0.1f;
+	private static final float 			INFOITEM_SHOW_DURATION 				= 0.2f;
+	private static final float 			INFOITEM_INITIAL_SCALE 				= 0.5f;
+	
+	private static final float 			CREATURE_SIZE_RATIO 				= 3f/5;
+	private static final float 			INFOITEM_SIZE_RATIO 				= 2f/7;
+	
+    private static final float          CREATURE_STRAT_MOVE_DURATION 		= 1.5f;
+    private static final float          CREATURE_MOVE_DURATION_STEP  		= 0.013f;
+    private static final float          CREATURE_FROM_SCALE          		= 0.1f;
+    private static final float          CREATURE_TO_SCALE            		= 1.05f;
+    private static final float          CREATURE_FINAL_SCALE         		= 0.9f;
     
-    private final static float 			CREATURE_MIDDLE_DELAY_MODIFIER 	= 0.5f;
-	private final static float 			CREATURE_FINISH_DELAY_MODIFIER 	= 0.25f;
+    private final static float 			CREATURE_MIDDLE_DELAY_MODIFIER 		= 0.5f;
+	private final static float 			CREATURE_FINISH_DELAY_MODIFIER 		= 0.25f;
 	
-	private final static Interpolation 	CREATURE_START_INTERPOLATION 	= Interpolation.pow4Out;
-	private final static Interpolation 	CREATURE_MIDDLE_INTERPOLATION 	= Interpolation.pow4In;
-	private final static Interpolation 	CREATURE_FINISH_INTERPOLATION 	= Interpolation.linear;
+	private final static Interpolation 	CREATURE_START_INTERPOLATION 		= Interpolation.pow4Out;
+	private final static Interpolation 	CREATURE_MIDDLE_INTERPOLATION 		= Interpolation.pow4In;
+	private final static Interpolation 	CREATURE_FINISH_INTERPOLATION 		= Interpolation.linear;
 	
 	private final Group creatureLayer 	= new Group();
+	private final Group infoItemLayer 	= new Group();
 	
 	private float 	creatureStartPositionX;
 	private float 	creatureStartPositionY;
@@ -96,7 +190,7 @@ public class GameScreen extends ScreenAdapter {
 	
 	private Stage 	stage;
 	
-	private int 	creatureNumber = 0;
+	private int 	creatureNumber = -1;
 
 	@Override
 	public void show() {
@@ -106,9 +200,11 @@ public class GameScreen extends ScreenAdapter {
 		stage.addActor(new GameBackground());
 		stage.addActor(creatureLayer);
 		stage.addActor(new GameForeground());
+		stage.addActor(infoItemLayer);
 		
 		stage.setDebugAll(true);
 		
+		InfoItem.init(stage);
 		prepareCreaturePositions(stage.getViewport().getWorldWidth(), stage.getViewport().getWorldHeight());
 		showNextCreature(BankRoberryGameDataManager.getInstance().getResult());
 	}
@@ -122,6 +218,7 @@ public class GameScreen extends ScreenAdapter {
 	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());
 	}
 	
@@ -150,6 +247,7 @@ public class GameScreen extends ScreenAdapter {
     }
 	
 	private void showNextCreature(final List<CreatureRoot> creatures) {
+		creatureNumber++;
         if ((creatureNumber < creatures.size()) && (getNumberOfMistakesInGame() < 3)) {
         	final float duration = getCreatureMoveDurationForCreatureNumber(creatureNumber);
             final CreatureRoot creature = creatures.get(creatureNumber);
@@ -162,8 +260,16 @@ public class GameScreen extends ScreenAdapter {
             	
             	@Override
             	public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
-            		creature.removeListener(this);
-            		Log.info(getClass(), "TOUCH");
+            		creature.removeListener(this);	
+            		if (creature.isThief()) {
+            			creature.setRevealed(true);
+                        InfoItem.ARRESTED.show();
+//                        getGameManager().setExtraInt1AndSave(bankovniloupezActivity.getGameManager().getExtraInt1() + 1);
+                    } else {
+                    	InfoItem.INNOCENCE.show();
+//                        getGameManager().setExtraInt3AndSave(bankovniloupezActivity.getGameManager().getExtraInt3() + 1);
+                    }
+            		
             		return true;
             	}
             	
@@ -172,7 +278,14 @@ public class GameScreen extends ScreenAdapter {
             creature.addAction(sequence(parallel(moveTo(creatureMiddle1PositionX, creatureMiddle1PositionY, duration, CREATURE_START_INTERPOLATION),
             									 scaleTo(CREATURE_TO_SCALE, CREATURE_TO_SCALE, duration, CREATURE_START_INTERPOLATION)),
             							parallel(moveTo(creatureMiddle2PositionX, creatureMiddle2PositionY, duration * CREATURE_MIDDLE_DELAY_MODIFIER, CREATURE_MIDDLE_INTERPOLATION),
-            									 scaleTo(CREATURE_FINAL_SCALE, CREATURE_FINAL_SCALE, duration * CREATURE_MIDDLE_DELAY_MODIFIER, CREATURE_MIDDLE_INTERPOLATION)),
+            									 scaleTo(CREATURE_FINAL_SCALE, CREATURE_FINAL_SCALE, duration * CREATURE_MIDDLE_DELAY_MODIFIER, CREATURE_MIDDLE_INTERPOLATION),
+            									 run(new Runnable() {
+ 													
+ 													@Override
+ 													public void run() {
+ 														InfoItem.ALARM.hide();
+ 													}
+ 												})),
             							parallel(moveTo(creatureFinishPositionX, creatureFinishPositionY, duration * CREATURE_FINISH_DELAY_MODIFIER, CREATURE_FINISH_INTERPOLATION),
             									 run(new Runnable() {
 													
@@ -180,16 +293,20 @@ public class GameScreen extends ScreenAdapter {
 													public void run() {
 														//do not touch behind window
 														creature.removeListener(inputListener);
-													}
-													
+														InfoItem.ARRESTED.hide();
+														InfoItem.INNOCENCE.hide();
+														if (creature.isThief() && !creature.isRevealed()) {
+															InfoItem.ALARM.show();
+//									                        getGameManager().setExtraInt2AndSave(getGameManager().getExtraInt2() + 1);
+									                    }
+														showNextCreature(creatures);
+													}							
 												})),
             							run(new Runnable() {
-											
+            								
 											@Override
 											public void run() {
 												creature.remove();
-												creatureNumber++;
-												showNextCreature(creatures);
 											}
 										})));
             creatureLayer.addActor(creature);
diff --git a/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java b/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java
index 786b5017d..d37d4c9f9 100644
--- a/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java
+++ b/desktop/src/cz/nic/tablexia/desktop/DesktopLauncher.java
@@ -7,6 +7,7 @@ import cz.nic.tablexia.TablexiaLibGDX;
 public class DesktopLauncher {
 	public static void main (String[] arg) {
 		LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
+		config.resizable = false;
 		config.width = 1280;
 		config.height = 800;
 		new LwjglApplication(new TablexiaLibGDX(), config);
-- 
GitLab