From 1f65dc6dbd78eddb7bb55a6d44c1740f682ea7f9 Mon Sep 17 00:00:00 2001 From: Victor Date: Sun, 16 Mar 2014 19:12:19 +0200 Subject: [PATCH] Add rounds support --- src/com/annimon/turrets/GameCanvas.java | 43 +++++++++++++++++-------- src/com/annimon/turrets/Turret.java | 26 ++++++++++----- 2 files changed, 47 insertions(+), 22 deletions(-) diff --git a/src/com/annimon/turrets/GameCanvas.java b/src/com/annimon/turrets/GameCanvas.java index 1b6cfcc..7a98148 100644 --- a/src/com/annimon/turrets/GameCanvas.java +++ b/src/com/annimon/turrets/GameCanvas.java @@ -74,6 +74,9 @@ public class GameCanvas extends DoubleBufferedCanvas implements Runnable, Networ serverTurret.setTurretInfo((TurretInfo) data); serverTurret.shoot(); break; + case ON_NEW_ROUND: + newRound((long) data); + break; } } @@ -103,16 +106,12 @@ public class GameCanvas extends DoubleBufferedCanvas implements Runnable, Networ } private void startGame(long seed) { - Util.setRandomSeed(seed); - // Reinit background with same seed on server and client. - initBackground(); - terrain = new Terrain(Constants.WIDTH); - terrain.generate(); + newRound(seed); - serverTurret = new Turret(Turret.SERVER, terrain.getFirstBlockHeight(), terrain); + serverTurret = new Turret(Turret.SERVER, terrain); serverTurret.setTurretListener(serverTurretListener); - clientTurret = new Turret(Turret.CLIENT, terrain.getLastBlockHeight(), terrain); + clientTurret = new Turret(Turret.CLIENT, terrain); clientTurret.setTurretListener(clientTurretListener); instanceTurret = (serverInstance) ? serverTurret : clientTurret; @@ -122,12 +121,31 @@ public class GameCanvas extends DoubleBufferedCanvas implements Runnable, Networ roundWinCount = 0; } + private void newRound(long seed) { + Util.setRandomSeed(seed); + // Reinit background with same seed on server and client. + initBackground(); + terrain.generate(); + + if (gameStarted) { + serverTurret.reinit(); + clientTurret.reinit(); + } + } + private void finishRound(boolean serverWinRound) { if (serverInstance && serverWinRound) roundWinCount++; else if (!serverInstance && !serverWinRound) roundWinCount--; if (roundWinCount == Constants.MAX_ROUNDS) finishGame(true); else if (roundWinCount == -Constants.MAX_ROUNDS) finishGame(false); + else { + if (serverInstance) { + long seed = System.currentTimeMillis(); + socketHelper.sendNewRoundSeed(seed); + newRound(seed); + } + } } private void finishGame(boolean instanceWin) { @@ -160,11 +178,9 @@ public class GameCanvas extends DoubleBufferedCanvas implements Runnable, Networ private final Turret.TurretListener serverTurretListener = new Turret.TurretListener() { @Override - public void shootComplete(int x) { + public void shootComplete(boolean hitOpponent) { serverMove = !serverMove; - if (x == -1) return; - final int bound = Constants.WIDTH - Constants.PLAYERS_BLOCK_COUNT; - if (x > bound) { + if (hitOpponent) { finishRound(serverInstance); } } @@ -173,10 +189,9 @@ public class GameCanvas extends DoubleBufferedCanvas implements Runnable, Networ private final Turret.TurretListener clientTurretListener = new Turret.TurretListener() { @Override - public void shootComplete(int x) { + public void shootComplete(boolean hitOpponent) { serverMove = !serverMove; - if (x == -1) return; - if (x < Constants.PLAYERS_BLOCK_COUNT) { + if (hitOpponent) { finishRound(!serverInstance); } } diff --git a/src/com/annimon/turrets/Turret.java b/src/com/annimon/turrets/Turret.java index abcc526..c50bb8a 100644 --- a/src/com/annimon/turrets/Turret.java +++ b/src/com/annimon/turrets/Turret.java @@ -17,7 +17,8 @@ public class Turret implements Constants { private static final int TURRET_HEIGHT = PLAYERS_BLOCK_COUNT + 1; // Parameters - private final int turretX, turretY; + private final int turretX; + private int turretY; private final int barrelRadius; private final boolean server; private int barrelX, barrelY; @@ -30,16 +31,22 @@ public class Turret implements Constants { private final Terrain terrain; // TODO GameInfo private TurretListener listener; - public Turret(boolean server, int turretY, Terrain terrain) { + public Turret(boolean server, Terrain terrain) { this.server = server; this.turretX = (server ? 5 : Constants.WIDTH - 5); - this.turretY = turretY; this.terrain = terrain; + barrelRadius = Constants.WIDTH / 20; + shootInfo = new ShootInfo(); + reinit(); + } + + public final void reinit() { barrelAngle = ANGLE_45; shotPower = 0.5d; - barrelRadius = Constants.WIDTH / 20; shootState = false; - shootInfo = new ShootInfo(); + if (server) turretY = terrain.getFirstBlockHeight(); + else turretY = terrain.getLastBlockHeight(); + shootInfo.reset(); calculateBarrelPosition(); } @@ -58,11 +65,14 @@ public class Turret implements Constants { shootInfo.draw(g); if (shootInfo.isOver()) { shootState = false; - if (listener != null) listener.shootComplete(-1); + if (listener != null) listener.shootComplete(false); + } else if (shootInfo.isCollideOpponent(server, terrain)) { + shootState = false; + if (listener != null) listener.shootComplete(true); } else if (shootInfo.isCollideTerrain(terrain)) { shootState = false; terrain.destroyTerrain((int) shootInfo.x); - if (listener != null) listener.shootComplete((int) shootInfo.x); + if (listener != null) listener.shootComplete(false); } } if (DEBUG_MODE) { @@ -139,6 +149,6 @@ public class Turret implements Constants { } public interface TurretListener { - void shootComplete(int x); + void shootComplete(boolean hitOpponent); } }