diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java b/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java index d93af8f6444cb0a62290d37c0162e1ae89676bc5..c5524fd208f8d8b4fbc0e94acf45b75db9f6ae30 100644 --- a/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java +++ b/core/src/cz/nic/tablexia/game/games/shooting_range/ShootingRangeGame.java @@ -16,6 +16,8 @@ import cz.nic.tablexia.game.games.shooting_range.actors.Watch; import cz.nic.tablexia.game.games.shooting_range.media.SoundType; import cz.nic.tablexia.game.games.shooting_range.media.Textures; import cz.nic.tablexia.game.games.shooting_range.model.GameState; +import cz.nic.tablexia.game.games.shooting_range.tools.TargetGenerator; +import cz.nic.tablexia.util.Log; /** * Created by lhoracek @@ -25,10 +27,12 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> { private GfxLibrary gfxLibrary = new GfxLibrary(this, Textures.values()); private SfxLibrary sfxLibrary = new SfxLibrary(this, SoundType.values()); - private Scene scene; - private Carousel carousel; - private Watch watch; - List<Target>[] waves; + private Scene scene; + private Carousel carousel; + private Watch watch; + private List<Target>[] waves; + private TargetGenerator targetGenerator; + @Override protected void prepareScreenSoundAssetNames(List<String> soundsFileNames) { @@ -38,7 +42,7 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> { @Override protected GameState prepareGameData(Map<String, String> gameState) { - GameState gameData = new GameState(getGameDifficulty(), getRandom()); + GameState gameData = new GameState(); return gameData; } @@ -48,14 +52,15 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> { super.gameLoaded(gameState); initScene(); - // TODO start game - - // TODO next flower - // start timer - - waves = getData().getTargetGenerator().initWaves(); - + targetGenerator = new TargetGenerator(getGameDifficulty(), getRandom(), gfxLibrary); + waves = targetGenerator.initWaves(); + for (List<Target> wave : waves) { + for (Target target : wave) { + scene.addActor(target); + Log.info(getClass(), "Added target " + target.toString()); + } + } getStage().addAction(Actions.sequence(Actions.delay(1), Actions.run(new Runnable() { // TODO animate flowers in // TODO animate hand in @@ -79,8 +84,8 @@ public class ShootingRangeGame extends AbstractTablexiaGame<GameState> { for (List<Target> wave : waves) { for (Target target : wave) { - scene.addActor(target); - target.getWave().getY(getData().getTime() - target.getStartTime(), 100); + target.setX(target.getWave().getX(getData().getTime() - target.getStartTime(), getStage().getWidth())); + target.setY(target.getWave().getY(getData().getTime() - target.getStartTime(), 100)); } } diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java b/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java index 9d41468db5a5b0b4dd427965a3b34ed9286a4ae2..133c31c68cc62a0a45977cb3f6abb3189fbc58b0 100644 --- a/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java +++ b/core/src/cz/nic/tablexia/game/games/shooting_range/actors/Target.java @@ -101,4 +101,13 @@ public class Target extends Image { this.effect = effect; } + + @Override + public String toString() { + return "Target{" + + "textureType=" + textureType + + ", wave=" + wave + + ", shot=" + shot + + '}'; + } } diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java b/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java index ccf160fb7e4752662f9cc6bf5308037f4c6af1b2..1d0418559deabcf2bf2346a254b307acd142df0b 100644 --- a/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java +++ b/core/src/cz/nic/tablexia/game/games/shooting_range/model/GameState.java @@ -1,29 +1,15 @@ package cz.nic.tablexia.game.games.shooting_range.model; -import java.util.Random; - -import cz.nic.tablexia.game.difficulty.GameDifficulty; -import cz.nic.tablexia.game.games.shooting_range.tools.TargetGenerator; - /** * Created by lhoracek on 6/22/15. */ public class GameState { - private TargetGenerator targetGenerator; private boolean running = false; private int score = 0; private float time = 0f; - public GameState(GameDifficulty gameDifficulty, Random random) { - targetGenerator = new TargetGenerator(gameDifficulty, random); - } - - public TargetGenerator getTargetGenerator() { - return targetGenerator; - } - public int getScore() { return score; } diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java index 56cc497c9f7bcea14ba11ddec0e9ca6075871a6c..6319b69ae16621fb5d62b1668db8c97e8d165e59 100644 --- a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java +++ b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetGenerator.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; import java.util.Random; +import cz.nic.tablexia.game.common.media.GfxLibrary; import cz.nic.tablexia.game.difficulty.GameDifficulty; import cz.nic.tablexia.game.games.shooting_range.media.Textures; import cz.nic.tablexia.game.games.shooting_range.actors.Target; @@ -28,11 +29,14 @@ public class TargetGenerator { private GameDifficulty gameDifficulty; private Random random; + private GfxLibrary gfxLibrary; - public TargetGenerator(GameDifficulty gameDifficulty, Random random) { + public TargetGenerator(GameDifficulty gameDifficulty, Random random, GfxLibrary gfxLibrary) { super(); this.random = random; this.gameDifficulty = gameDifficulty; + this.gfxLibrary = gfxLibrary; + } public Textures getRandomFlowerType(GameDifficulty gameDifficulty) { @@ -78,7 +82,6 @@ public class TargetGenerator { // přidáme jeden terč za okraj na prvn obrazovce for (int i = -flowerNumber; i <= 0; i++) { - Target target = getRandomTarget(textureTypeBag, targetPeriod * i, wave); flowers.add(target); if (i == 0) { @@ -109,10 +112,7 @@ public class TargetGenerator { textureType = textureTypeBag.get(random); } - // TODO - // Target target = new Target(0, 0, gfxManager.get(textureType).second, startTime, wave, textureType); - // return target; - return null; + return new Target(gfxLibrary.getTextureRegion(textureType), startTime, wave, textureType); } private float getBoxProbability() { diff --git a/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetPositionController.java b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetPositionController.java new file mode 100644 index 0000000000000000000000000000000000000000..32b0a960fd01ffeb746cb8e40ca69bbcd75aeef9 --- /dev/null +++ b/core/src/cz/nic/tablexia/game/games/shooting_range/tools/TargetPositionController.java @@ -0,0 +1,141 @@ +package cz.nic.tablexia.game.games.shooting_range.tools; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + +import cz.nic.tablexia.game.games.shooting_range.actors.Target; +import cz.nic.tablexia.game.games.shooting_range.media.Textures; +import cz.nic.tablexia.game.games.shooting_range.model.Wave; + +/** + * Created by lhoracek on 7/2/15. + */ +public class TargetPositionController { + + public static final float GAME_SPEED_FAST = 2.0f; + public static final float GAME_SPEED_NORMAL = 1f; + public static final float GAME_SPEED_SLOW = 0.5f; + public static final float GAME_SPEED_TIMEOUT = 5f; + + private float elapsedTime = 0; + private final List<Target> targets; + private float gameSpeed = 1; + private final TargetGenerator targetGenerator; + private final Random random; + private final float width; + + + public TargetPositionController(List<Target> targets, TargetGenerator targetGenerator, Random random, float width) { + super(); + this.targets = targets; + this.targetGenerator = targetGenerator; + this.random = random; + this.width = width; + } + + public void setGameSpeed(float gameSpeed) { + this.gameSpeed = gameSpeed; + } + + public void resetGameSpeed() { + gameSpeed = GAME_SPEED_NORMAL; + } + + /* + * (non-Javadoc) + * @see org.andengine.engine.handler.IUpdateHandler#onUpdate(float) + */ + @Override + public void onUpdate(float pSecondsElapsed) { + elapsedTime += (pSecondsElapsed * gameSpeed); + + List<Target> toRemove = new ArrayList<Target>(); + List<Target> toAdd = new ArrayList<Target>(); + List<Target> invisibles = new ArrayList<Target>(); + Set<Textures> availableTypes = new HashSet<Textures>(); + Set<Wave> waves = new HashSet<Wave>(); + for (Target target : targets) { + float x = target.getWave().getX(elapsedTime - target.getStartTime(), width); + if ((x > 0) && (x < width)) { + // cil je na scene + if (target.getParent() == null) { + // jeste nebyl vykreslen, tak ho pridame do sceny + // TODO + + scene.attachChild(target); + scene.registerTouchArea(target); + scene.sortChildren(); + target.setOnAreaTouchedListener(parent); + if (targetGenerator.getLastTargetInWave(target.getWave()).equals(target)) { + toAdd.add(targetGenerator.addNewTargetToWave(target.getWave(), parent.getVertexBufferObjectManager(), null)); + } + } + target.setX(x); + target.setY((baseHeight - ((height * StrelniceActivity.WAVE_VERTICAL_OFFSET) / 2)) + target.getWave().getY(elapsedTime - target.getStartTime(), height) + (target.getWave().getVerticalOrder() * (height * StrelniceActivity.WAVE_VERTICAL_OFFSET))); + + if (target.getEffect() != null) { + target.getEffect().setX(x); + } + // koukame pouze na prvnà polovinu obrazovky a ukladama si dostupne kytky + if ((x > (Direction.RIGHT == target.getWave().getDirection() ? 0 : width / 2)) && (x < (Direction.RIGHT == target.getWave().getDirection() ? width / 2 : width))) { + // pouze nesestřelené + if (!target.isShot()) { + availableTypes.add(target.getTextureType()); + } + } + waves.add(target.getWave()); + } else { + if (target.getParent() != null) { + // je na scene, ale je mimo jeji sirku, tak ho odebereme ze sceny + final Target flowerToRemove = target; + parent.runOnUpdateThread(new Runnable() { + @Override + public void run() { + scene.unregisterTouchArea(flowerToRemove); + flowerToRemove.detachSelf(); + } + }); + } else { + if (((target.getWave().getDirection() == Direction.LEFT) && (x < 0)) || ((target.getWave().getDirection() == Direction.RIGHT) && (x > width))) { + // už je mimo obraz + toRemove.add(target); + } else { + // teprve přicházà do obrazu + availableTypes.add(target.getTextureType()); // TODO zkusime vypnout ocekavane kytky, aby jich rovnou pridaval vic + invisibles.add(target); + } + } + } + } + + targets.removeAll(toRemove); + targets.addAll(toAdd); + invisibles.addAll(toAdd); + + if ((parent.getCurrentTarget() != null) && !availableTypes.contains(parent.getCurrentTarget().first)) { + if (invisibles.size() > 0) { + int index = random.nextInt(invisibles.size()); + Target swap = invisibles.get(index); + Target swapTo = targetGenerator.addNewTargetToWave(swap.getWave(), parent.getVertexBufferObjectManager(), parent.getCurrentTarget().first, swap.getStartTime(), targetGenerator.getLastTargetInWave(swap.getWave()).equals(swap)); + targets.remove(swap); + targets.add(swapTo); + } else { + targets.add(targetGenerator.addNewTargetToWave(waves.toArray(new Wave[0])[random.nextInt(waves.size())], parent.getVertexBufferObjectManager(), parent.getCurrentTarget().first)); + } + } + + } + + /* + * (non-Javadoc) + * @see org.andengine.engine.handler.IUpdateHandler#reset() + */ + @Override + public void reset() { + } + + +}