From cde2d368871646bb08934fd6b7f459c1b91d9016 Mon Sep 17 00:00:00 2001 From: pacien Date: Sun, 4 Feb 2018 19:01:05 +0100 Subject: Implement garbage destruction on trash meeting Signed-off-by: pacien --- .../java/fr/umlv/java/wallj/block/TrashBlock.java | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java b/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java index 33b5a6b..1f2dfa6 100644 --- a/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java +++ b/src/main/java/fr/umlv/java/wallj/block/TrashBlock.java @@ -3,12 +3,17 @@ package fr.umlv.java.wallj.block; import fr.umlv.java.wallj.board.TileVec2; import fr.umlv.java.wallj.context.Context; import fr.umlv.java.wallj.context.Updateables; +import fr.umlv.java.wallj.event.BlockDestroyEvent; import fr.umlv.java.wallj.event.Event; import org.jbox2d.common.Vec2; import org.jbox2d.dynamics.BodyType; +import org.jbox2d.dynamics.contacts.ContactEdge; import java.awt.*; +import java.util.Spliterator; +import java.util.function.Consumer; import java.util.stream.Stream; +import java.util.stream.StreamSupport; /** * A trash block. @@ -23,11 +28,53 @@ public class TrashBlock extends JBoxBlock { @Override public Stream update(Context context) { return Updateables.updateAll(context, + this::handleContacts, this::paint); } + private Stream handleContacts(Context context) { + return streamContactEdges() + .map(contactEdge -> ((Block) contactEdge.other.getUserData())) + .filter(otherBody -> otherBody.getType() == BlockType.GARBAGE) + .map(BlockDestroyEvent::new); + } + private Stream paint(Context context) { context.getGraphicsContext().paintRectangle(Color.RED, getPos(), TileVec2.TILE_DIM, TileVec2.TILE_DIM); return Stream.empty(); } + + private Stream streamContactEdges() { + // If only we had (a working) Java 9... + // return Stream.iterate(getBody().getContactList(), c -> c.next) + // .takeWhile(Objects::nonNull); + + return StreamSupport.stream(new Spliterator() { + private ContactEdge contactEdge = getBody().getContactList(); + + @Override + public boolean tryAdvance(Consumer consumer) { + if (contactEdge == null) return false; + + consumer.accept(contactEdge); + contactEdge = contactEdge.next; + return true; + } + + @Override + public Spliterator trySplit() { + return null; + } + + @Override + public long estimateSize() { + return Long.MAX_VALUE; + } + + @Override + public int characteristics() { + return NONNULL; + } + }, false); + } } -- cgit v1.2.3