From 735be27e8802740cf0986bb6d14e720234889aae Mon Sep 17 00:00:00 2001 From: pacien Date: Thu, 1 Feb 2018 20:29:40 +0100 Subject: Rename events/orders ; Partial impl. of robot event handling Signed-off-by: pacien --- src/docs/class.puml | 20 +++++++--------- .../java/fr/umlv/java/wallj/block/RobotBlock.java | 25 ++++++++++++++----- .../fr/umlv/java/wallj/context/InputHandler.java | 8 +++---- .../java/wallj/controller/GameStateController.java | 4 ++-- .../fr/umlv/java/wallj/event/AddBombEvent.java | 21 ---------------- .../fr/umlv/java/wallj/event/BombSetupEvent.java | 28 ++++++++++++++++++++++ .../fr/umlv/java/wallj/event/BombSetupOrder.java | 10 ++++++++ .../fr/umlv/java/wallj/event/ConfirmEvent.java | 10 -------- .../fr/umlv/java/wallj/event/ConfirmOrder.java | 10 ++++++++ .../fr/umlv/java/wallj/event/DropBombEvent.java | 10 -------- src/main/java/fr/umlv/java/wallj/event/Event.java | 11 ++++++++- .../fr/umlv/java/wallj/event/GameOverEvent.java | 2 +- .../java/fr/umlv/java/wallj/event/InputEvent.java | 2 +- .../fr/umlv/java/wallj/event/MoveRobotEvent.java | 22 ----------------- .../fr/umlv/java/wallj/event/MoveRobotOrder.java | 28 ++++++++++++++++++++++ 15 files changed, 122 insertions(+), 89 deletions(-) delete mode 100644 src/main/java/fr/umlv/java/wallj/event/AddBombEvent.java create mode 100644 src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java create mode 100644 src/main/java/fr/umlv/java/wallj/event/BombSetupOrder.java delete mode 100644 src/main/java/fr/umlv/java/wallj/event/ConfirmEvent.java create mode 100644 src/main/java/fr/umlv/java/wallj/event/ConfirmOrder.java delete mode 100644 src/main/java/fr/umlv/java/wallj/event/DropBombEvent.java delete mode 100644 src/main/java/fr/umlv/java/wallj/event/MoveRobotEvent.java create mode 100644 src/main/java/fr/umlv/java/wallj/event/MoveRobotOrder.java diff --git a/src/docs/class.puml b/src/docs/class.puml index cfc78b1..151e334 100644 --- a/src/docs/class.puml +++ b/src/docs/class.puml @@ -87,26 +87,24 @@ package context { package event { interface Event - - interface InputEvent implements Event interface GameEvent implements Event + interface InputEvent implements Event - class DropBombEvent implements InputEvent + class ConfirmOrder implements InputEvent + class BombSetupOrder implements InputEvent - class AddBombEvent implements InputEvent { - final TileVec2 - AddBombEvent(TileVec2) - TileVec2 getTile() + class MoveRobotOrder implements InputEvent { + MoveRobotEvent(TileVec2) + TileVec2 getTarget() } - class MoveRobotEvent implements InputEvent { + class BombSetupEvent implements GameEvent { final TileVec2 - MoveRobotEvent(TileVec2) + AddBombEvent(TileVec2) TileVec2 getTile() } - class ConfirmEvent implements InputEvent - class GameOverEvent implements Event + class GameOverEvent implements GameEvent class ExplosionEvent implements GameEvent { Block source diff --git a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java index 45c75da..c011f27 100644 --- a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java @@ -1,13 +1,19 @@ package fr.umlv.java.wallj.block; +import fr.umlv.java.wallj.board.Board; +import fr.umlv.java.wallj.board.PathFinder; import fr.umlv.java.wallj.board.TileVec2; import fr.umlv.java.wallj.context.Context; import fr.umlv.java.wallj.context.GraphicsContext; +import fr.umlv.java.wallj.event.BombSetupEvent; +import fr.umlv.java.wallj.event.BombSetupOrder; import fr.umlv.java.wallj.event.Event; +import fr.umlv.java.wallj.event.MoveRobotOrder; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.World; import java.awt.*; +import java.time.Duration; import java.util.Collections; import java.util.List; @@ -21,6 +27,7 @@ public class RobotBlock extends Block { private Vec2 pos; private List path = Collections.emptyList(); + private PathFinder pathFinder; RobotBlock(Vec2 pos) { super(BlockType.ROBOT); @@ -39,21 +46,27 @@ public class RobotBlock extends Block { @Override public List update(Context context) { - updatePath(context.getEvents()); - if (!path.isEmpty()) move(); + Event.findFirst(context.getEvents(), MoveRobotOrder.class) + .ifPresent(event -> updatePath(context.getGame().getCurrentStage().getBoard(), event.getTarget())); + + if (!path.isEmpty()) move(context.getTimeDelta()); paint(context.getGraphicsContext()); return setupBomb(context.getEvents()); } private List setupBomb(List events) { - return Collections.emptyList(); // TODO: return a SetupBombEvent at current location if an order was received + return Event.findFirst(events, BombSetupOrder.class) + .map(event -> Collections.singletonList(new BombSetupEvent(TileVec2.of(pos)))) + .orElse(Collections.emptyList()); } - private void updatePath(List events) { - // TODO: update path if received a new target event (using the pathfinder) + private void updatePath(Board board, TileVec2 target) { + if (!board.getBlockTypeAt(target).isTraversable()) return; + if (pathFinder == null) pathFinder = new PathFinder(board); + path = pathFinder.findPath(TileVec2.of(pos), target); } - private void move() { + private void move(Duration timeDelta) { // TODO: follow the current path } diff --git a/src/main/java/fr/umlv/java/wallj/context/InputHandler.java b/src/main/java/fr/umlv/java/wallj/context/InputHandler.java index 1a64667..64591df 100644 --- a/src/main/java/fr/umlv/java/wallj/context/InputHandler.java +++ b/src/main/java/fr/umlv/java/wallj/context/InputHandler.java @@ -1,8 +1,8 @@ package fr.umlv.java.wallj.context; import fr.umlv.java.wallj.board.TileVec2; -import fr.umlv.java.wallj.event.DropBombEvent; -import fr.umlv.java.wallj.event.MoveRobotEvent; +import fr.umlv.java.wallj.event.BombSetupOrder; +import fr.umlv.java.wallj.event.MoveRobotOrder; import fr.umlv.zen5.ApplicationContext; import fr.umlv.zen5.Event; import fr.umlv.zen5.KeyboardKey; @@ -43,7 +43,7 @@ public final class InputHandler { if (action == Event.Action.POINTER_DOWN) { Vec2 mouseLocation = new Vec2(location.x, location.y); TileVec2 mouseTileLocation = TileVec2.of(mouseLocation); - events.add(new MoveRobotEvent(mouseTileLocation)); + events.add(new MoveRobotOrder(mouseTileLocation)); } } KeyboardKey keyboardKey = event.getKey(); @@ -51,7 +51,7 @@ public final class InputHandler { if (action == Event.Action.KEY_PRESSED) { switch (keyboardKey) { case SPACE: - events.add(new DropBombEvent()); + events.add(new BombSetupOrder()); break; } } diff --git a/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java b/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java index 2c548f2..c2c28a7 100644 --- a/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java +++ b/src/main/java/fr/umlv/java/wallj/controller/GameStateController.java @@ -2,7 +2,7 @@ package fr.umlv.java.wallj.controller; import fr.umlv.java.wallj.context.Context; import fr.umlv.java.wallj.context.Game; -import fr.umlv.java.wallj.event.ConfirmEvent; +import fr.umlv.java.wallj.event.ConfirmOrder; import fr.umlv.java.wallj.event.Event; import fr.umlv.java.wallj.event.GameOverEvent; @@ -13,7 +13,7 @@ public class GameStateController implements Controller { @Override public List update(Context context) { - boolean isConfirmEvent = context.getEvents().stream().anyMatch(event -> event instanceof ConfirmEvent); + boolean isConfirmEvent = context.getEvents().stream().anyMatch(event -> event instanceof ConfirmOrder); boolean isGameOver = context.getEvents().stream().allMatch(event -> event instanceof GameOverEvent); Game currentGame = context.getGame(); LinkedList events = new LinkedList<>(); diff --git a/src/main/java/fr/umlv/java/wallj/event/AddBombEvent.java b/src/main/java/fr/umlv/java/wallj/event/AddBombEvent.java deleted file mode 100644 index 10581ff..0000000 --- a/src/main/java/fr/umlv/java/wallj/event/AddBombEvent.java +++ /dev/null @@ -1,21 +0,0 @@ -package fr.umlv.java.wallj.event; - -import fr.umlv.java.wallj.board.TileVec2; - -import java.util.Objects; - -/** - * Event to put a bomb on the game board - * - * @author Adam NAILI - */ -public final class AddBombEvent implements InputEvent { - TileVec2 tileVec2; - - /** - * @param tileVec2 a vector with coordinate relative to the tile - */ - public AddBombEvent(TileVec2 tileVec2) { - this.tileVec2 = Objects.requireNonNull(tileVec2); - } -} diff --git a/src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java b/src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java new file mode 100644 index 0000000..2e5cf98 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/event/BombSetupEvent.java @@ -0,0 +1,28 @@ +package fr.umlv.java.wallj.event; + +import fr.umlv.java.wallj.board.TileVec2; + +import java.util.Objects; + +/** + * Bomb setup event. + * + * @author Pacien TRAN-GIRARD + */ +public final class BombSetupEvent implements GameEvent { + private final TileVec2 pos; + + /** + * @param pos requested setup position + */ + public BombSetupEvent(TileVec2 pos) { + this.pos = Objects.requireNonNull(pos); + } + + /** + * @return the setup position + */ + public TileVec2 getPos() { + return pos; + } +} diff --git a/src/main/java/fr/umlv/java/wallj/event/BombSetupOrder.java b/src/main/java/fr/umlv/java/wallj/event/BombSetupOrder.java new file mode 100644 index 0000000..99c0942 --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/event/BombSetupOrder.java @@ -0,0 +1,10 @@ +package fr.umlv.java.wallj.event; + +/** + * Event to signal that a bomb will be placed at the next tick + * + * @author Adam NAILI + */ +public final class BombSetupOrder implements InputEvent { + +} diff --git a/src/main/java/fr/umlv/java/wallj/event/ConfirmEvent.java b/src/main/java/fr/umlv/java/wallj/event/ConfirmEvent.java deleted file mode 100644 index 6f1e403..0000000 --- a/src/main/java/fr/umlv/java/wallj/event/ConfirmEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.umlv.java.wallj.event; - -/** - * Event coming from a confirmation action from the user - * - * @author Adam NAILI - */ -public class ConfirmEvent implements InputEvent { - //TODO Class ConfirmEvent -} diff --git a/src/main/java/fr/umlv/java/wallj/event/ConfirmOrder.java b/src/main/java/fr/umlv/java/wallj/event/ConfirmOrder.java new file mode 100644 index 0000000..fae6d2f --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/event/ConfirmOrder.java @@ -0,0 +1,10 @@ +package fr.umlv.java.wallj.event; + +/** + * Event coming from a confirmation action from the user + * + * @author Adam NAILI + */ +public class ConfirmOrder implements InputEvent { + //TODO Class ConfirmOrder +} diff --git a/src/main/java/fr/umlv/java/wallj/event/DropBombEvent.java b/src/main/java/fr/umlv/java/wallj/event/DropBombEvent.java deleted file mode 100644 index 4386288..0000000 --- a/src/main/java/fr/umlv/java/wallj/event/DropBombEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.umlv.java.wallj.event; - -/** - * Event to signal that a bomb will be placed at the next tick - * - * @author Adam NAILI - */ -public final class DropBombEvent implements InputEvent { - //TODO Class DropBombEvent -} diff --git a/src/main/java/fr/umlv/java/wallj/event/Event.java b/src/main/java/fr/umlv/java/wallj/event/Event.java index 77ce0df..5b8b500 100644 --- a/src/main/java/fr/umlv/java/wallj/event/Event.java +++ b/src/main/java/fr/umlv/java/wallj/event/Event.java @@ -1,9 +1,18 @@ package fr.umlv.java.wallj.event; +import java.util.List; +import java.util.Optional; + /** * An application event * - * @author Adam NAILI + * @author Pacien TRAN-GIRARD */ public interface Event { + static Optional findFirst(List eventList, Class eventClass) { + return eventList.stream() + .filter(e -> e.getClass().isInstance(eventClass)) + .findFirst() + .map(eventClass::cast); + } } diff --git a/src/main/java/fr/umlv/java/wallj/event/GameOverEvent.java b/src/main/java/fr/umlv/java/wallj/event/GameOverEvent.java index 1a9cf11..eeee927 100644 --- a/src/main/java/fr/umlv/java/wallj/event/GameOverEvent.java +++ b/src/main/java/fr/umlv/java/wallj/event/GameOverEvent.java @@ -1,5 +1,5 @@ package fr.umlv.java.wallj.event; -public final class GameOverEvent implements Event { +public final class GameOverEvent implements GameEvent { // TODO } diff --git a/src/main/java/fr/umlv/java/wallj/event/InputEvent.java b/src/main/java/fr/umlv/java/wallj/event/InputEvent.java index d18cba0..20a6203 100644 --- a/src/main/java/fr/umlv/java/wallj/event/InputEvent.java +++ b/src/main/java/fr/umlv/java/wallj/event/InputEvent.java @@ -1,7 +1,7 @@ package fr.umlv.java.wallj.event; /** - * An event coming from inputs + * An event or order coming from inputs * * @author Adam NAILI */ diff --git a/src/main/java/fr/umlv/java/wallj/event/MoveRobotEvent.java b/src/main/java/fr/umlv/java/wallj/event/MoveRobotEvent.java deleted file mode 100644 index a8c9da2..0000000 --- a/src/main/java/fr/umlv/java/wallj/event/MoveRobotEvent.java +++ /dev/null @@ -1,22 +0,0 @@ -package fr.umlv.java.wallj.event; - -import fr.umlv.java.wallj.board.TileVec2; - -import java.util.Objects; - -/** - * Event to precise that the robot is supposed to move on the tile provided - * - * @author Adam NAILI - */ -public class MoveRobotEvent implements InputEvent { - //TODO Class MoveRobotEvent - TileVec2 tileVec2; - - /** - * @param tileVec2 the target tile - */ - public MoveRobotEvent(TileVec2 tileVec2) { - this.tileVec2 = Objects.requireNonNull(tileVec2); - } -} diff --git a/src/main/java/fr/umlv/java/wallj/event/MoveRobotOrder.java b/src/main/java/fr/umlv/java/wallj/event/MoveRobotOrder.java new file mode 100644 index 0000000..9fdd10a --- /dev/null +++ b/src/main/java/fr/umlv/java/wallj/event/MoveRobotOrder.java @@ -0,0 +1,28 @@ +package fr.umlv.java.wallj.event; + +import fr.umlv.java.wallj.board.TileVec2; + +import java.util.Objects; + +/** + * Robot move order. + * + * @author Pacien TRAN-GIRARD + */ +public class MoveRobotOrder implements InputEvent { + private final TileVec2 target; + + /** + * @param target the target position + */ + public MoveRobotOrder(TileVec2 target) { + this.target = Objects.requireNonNull(target); + } + + /** + * @return the target tile + */ + public TileVec2 getTarget() { + return target; + } +} -- cgit v1.2.3