diff --git a/core/src/cz/nic/tablexia/BankRoberryAssetManager.java b/core/src/cz/nic/tablexia/BankRoberryAssetManager.java index e27e217272b1ac172c5317b4c55c5bc6f85866c2..00feed002355ca9327f8bbb07174127f50ff2764 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 cc8d7a23d7023c61f16a73c9f209ac1ad8ad01c1..07fbe3ec0e4c5dbdccd05ab479c81ca01e74e130 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 4a002a75f392e092557c2ed3e04013ba54e24a2a..7db317f1e1fdb9c85524d571195145143c907ba8 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 786b5017df86f302c9b113587c124a16f6736069..d37d4c9f9b3ec037113b356d6304f1ed4211a8a7 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);