From a627b2f4591147dadd82f802bc8391333034b4b8 Mon Sep 17 00:00:00 2001 From: pacien Date: Fri, 2 Feb 2018 22:39:27 +0100 Subject: Implement block deletion/creation ; Remove StageClearedEvent Signed-off-by: pacien --- src/docs/class.puml | 1 - src/main/java/fr/umlv/java/wallj/block/Block.java | 5 +++ .../java/fr/umlv/java/wallj/block/JBoxBlock.java | 6 +++ .../java/fr/umlv/java/wallj/block/RobotBlock.java | 5 +++ .../java/fr/umlv/java/wallj/context/Stage.java | 43 +++++++++++++--------- .../fr/umlv/java/wallj/context/Updateable.java | 3 +- .../umlv/java/wallj/event/StageClearedEvent.java | 10 ----- 7 files changed, 43 insertions(+), 30 deletions(-) delete mode 100644 src/main/java/fr/umlv/java/wallj/event/StageClearedEvent.java diff --git a/src/docs/class.puml b/src/docs/class.puml index a889371..d8c6e81 100644 --- a/src/docs/class.puml +++ b/src/docs/class.puml @@ -101,7 +101,6 @@ package event { } class GameOverEvent implements GameEvent - class StageClearedEvent implements GameEvent class BlockCreateEvent implements GameEvent class BlockDestroyEvent implements GameEvent } diff --git a/src/main/java/fr/umlv/java/wallj/block/Block.java b/src/main/java/fr/umlv/java/wallj/block/Block.java index 7ae9c06..003c782 100644 --- a/src/main/java/fr/umlv/java/wallj/block/Block.java +++ b/src/main/java/fr/umlv/java/wallj/block/Block.java @@ -45,4 +45,9 @@ public abstract class Block implements Updateable { * @param world a JBox2D world */ public abstract void link(World world); + + /** + * @param world a JBox2D world + */ + public abstract void unlink(World world); } diff --git a/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java b/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java index 06ecca3..f0f2834 100644 --- a/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/JBoxBlock.java @@ -33,4 +33,10 @@ public abstract class JBoxBlock extends Block { body.createFixture(fixtureDef); body.setUserData(this); } + + @Override + public void unlink(World world) { + if (body == null) throw new IllegalStateException("Block has not yet been linked."); + world.destroyBody(body); + } } 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 7d370e5..45ed5bd 100644 --- a/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/RobotBlock.java @@ -44,6 +44,11 @@ public class RobotBlock extends Block { // no-op } + @Override + public void unlink(World world) { + // no-op + } + @Override public List update(Context context) { Events.findFirst(context.getEvents(), MoveRobotOrder.class) diff --git a/src/main/java/fr/umlv/java/wallj/context/Stage.java b/src/main/java/fr/umlv/java/wallj/context/Stage.java index 860f451..8852568 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Stage.java +++ b/src/main/java/fr/umlv/java/wallj/context/Stage.java @@ -1,6 +1,8 @@ package fr.umlv.java.wallj.context; import fr.umlv.java.wallj.block.Block; +import fr.umlv.java.wallj.block.BlockFactory; +import fr.umlv.java.wallj.block.BlockType; import fr.umlv.java.wallj.board.Board; import fr.umlv.java.wallj.board.BoardConverter; import fr.umlv.java.wallj.event.*; @@ -8,7 +10,6 @@ import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.World; import java.time.Duration; -import java.util.Collections; import java.util.List; import java.util.Objects; @@ -23,38 +24,47 @@ public class Stage implements Updateable { private final Board board; private final List blocks; + /** + * @param board the base board + */ public Stage(Board board) { this.board = Objects.requireNonNull(board); - this.blocks = BoardConverter.boardToWorld(board); - // TODO: link blocks to world + blocks = BoardConverter.boardToWorld(board); + blocks.forEach(block -> block.link(world)); } + /** + * @return the JBox2D world + */ public World getWorld() { return world; } /** - * @return the current board of the game + * @return the base board */ public Board getBoard() { return board; } - private boolean isCleared() { - // TODO - return false; + /** + * @return T(this stage is cleared, i.e. does not contain any garbage block) + * @implNote TODO: profile this and consider a garbage block counter + */ + public boolean isCleared() { + return blocks.stream().noneMatch(block -> block.getType() == BlockType.GARBAGE); } /** * @param context the current context - * @return a list of new events to perform + * @return the list of newly generated events */ @Override public List update(Context context) { updatePhysicalWorld(context.getTimeDelta()); handleBlockDestruction(context.getEvents()); handleBlockCreation(context.getEvents()); - return generateEvents(); + return Updateable.updateAll(blocks, context); } private void updatePhysicalWorld(Duration timeDelta) { @@ -64,18 +74,15 @@ public class Stage implements Updateable { private void handleBlockDestruction(List events) { Events.filter(events, BlockDestroyEvent.class).forEach(event -> { - }); // TODO + if (blocks.remove(event.getBlock())) event.getBlock().unlink(world); + }); } private void handleBlockCreation(List events) { Events.filter(events, BlockCreateEvent.class).forEach(event -> { - }); // TODO - } - - private List generateEvents() { - if (isCleared()) - return Collections.singletonList(new StageClearedEvent()); - else - return Collections.emptyList(); + Block block = BlockFactory.build(event.getBlockType(), event.getPos()); + blocks.add(block); + block.link(world); + }); } } diff --git a/src/main/java/fr/umlv/java/wallj/context/Updateable.java b/src/main/java/fr/umlv/java/wallj/context/Updateable.java index 468fe2c..45c217e 100644 --- a/src/main/java/fr/umlv/java/wallj/context/Updateable.java +++ b/src/main/java/fr/umlv/java/wallj/context/Updateable.java @@ -18,9 +18,10 @@ public interface Updateable { /** * @param updateables list of updateables * @param context an update context + * @param the updateable type * @return a list of collected generated events */ - static List updateAll(List updateables, Context context) { + static List updateAll(List updateables, Context context) { return updateables.stream() .flatMap(u -> u.update(context).stream()) .collect(Collectors.toList()); diff --git a/src/main/java/fr/umlv/java/wallj/event/StageClearedEvent.java b/src/main/java/fr/umlv/java/wallj/event/StageClearedEvent.java deleted file mode 100644 index 2543ad9..0000000 --- a/src/main/java/fr/umlv/java/wallj/event/StageClearedEvent.java +++ /dev/null @@ -1,10 +0,0 @@ -package fr.umlv.java.wallj.event; - -/** - * Signals that a stage is cleared. - * - * @author Pacien TRAN-GIRARD - */ -public final class StageClearedEvent implements GameEvent { - // void -} -- cgit v1.2.3