diff --git a/Movable_Ui/src/com/myownb3/piranha/launch/CollisionDetectionHandlerImpl.java b/Movable_Ui/src/com/myownb3/piranha/launch/CollisionDetectionHandlerImpl.java
index 642731c7..314c75d2 100644
--- a/Movable_Ui/src/com/myownb3/piranha/launch/CollisionDetectionHandlerImpl.java
+++ b/Movable_Ui/src/com/myownb3/piranha/launch/CollisionDetectionHandlerImpl.java
@@ -6,6 +6,8 @@
import javax.swing.SwingUtilities;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResultImpl;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.position.Position;
import com.myownb3.piranha.core.moveables.EndPointMoveable;
@@ -24,14 +26,18 @@ public CollisionDetectionHandlerImpl(Stoppable stoppable, MainWindow mainWindow)
}
@Override
- public void handleCollision(GridElement otherGridElement, GridElement movedGridElement, Position newPosition) {
- if (stoppable.isRunning() && isCollisionWithMoveable(movedGridElement)) {
- stoppable.stop();
- if (moveableController != null) {
- moveableController.stop();
+ public CollisionDetectionResult handleCollision(GridElement otherGridElement, GridElement movedGridElement, Position newPosition) {
+ if (stoppable.isRunning()) {
+ if (isCollisionWithMoveable(movedGridElement)) {
+ stoppable.stop();
+ if (moveableController != null) {
+ moveableController.stop();
+ }
+ SwingUtilities.invokeLater(() -> mainWindow.showCollisionInfo());
}
SwingUtilities.invokeLater(() -> mainWindow.showCollisionInfo());
}
+ return new CollisionDetectionResultImpl(false, newPosition);
}
private static boolean isCollisionWithMoveable(GridElement gridElement) {
diff --git a/Movable_Ui/src/com/myownb3/piranha/launch/MazePostMoveForwardHandler.java b/Movable_Ui/src/com/myownb3/piranha/launch/MazePostMoveForwardHandler.java
index a1af7973..18242554 100644
--- a/Movable_Ui/src/com/myownb3/piranha/launch/MazePostMoveForwardHandler.java
+++ b/Movable_Ui/src/com/myownb3/piranha/launch/MazePostMoveForwardHandler.java
@@ -20,6 +20,7 @@ public MazePostMoveForwardHandler(MainWindowHolder windowHolder, MoveableControl
@Override
public void handlePostMoveForward(MoveResult moveResult) {
+ super.handlePostMoveForward(moveResult);
Moveable moveable = getMoveableController().getMoveable();
lightBarrier.checkGridElement(moveable);
}
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/CollisionDetectedException.java b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectedException.java
similarity index 100%
rename from MoveableImpl/src/com/myownb3/piranha/core/grid/collision/CollisionDetectedException.java
rename to Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectedException.java
diff --git a/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionHandler.java b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionHandler.java
index ffbd4342..92a8433b 100644
--- a/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionHandler.java
+++ b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionHandler.java
@@ -28,6 +28,7 @@ public interface CollisionDetectionHandler {
* the {@link GridElement} which caused the collision with the other {@link GridElement}
* @param newPosition
* the Position at which the collision occurred
+ * @return a {@link CollisionDetectionResult} which contains the results of the collision handling
*/
- void handleCollision(GridElement otherGridElement, GridElement movedGridElement, Position newPosition);
+ CollisionDetectionResult handleCollision(GridElement otherGridElement, GridElement movedGridElement, Position newPosition);
}
diff --git a/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionResult.java b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionResult.java
new file mode 100644
index 00000000..9b3f06ec
--- /dev/null
+++ b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionResult.java
@@ -0,0 +1,24 @@
+package com.myownb3.piranha.core.grid.collision;
+
+import com.myownb3.piranha.core.grid.Grid;
+import com.myownb3.piranha.core.grid.position.Position;
+
+/**
+ * The {@link CollisionDetectionResult} contains the result of a collision, detected by a {@link CollisionDetectionHandler}
+ *
+ * @author Dominic
+ *
+ */
+public interface CollisionDetectionResult {
+
+ /**
+ * @return the by the {@link Grid} moved {@link Position}
+ */
+ Position getMovedPosition();
+
+
+ /**
+ * @return true
if there was a collision or false
if not
+ */
+ boolean isCollision();
+}
diff --git a/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetector.java b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetector.java
index 5cdaed36..2213030b 100644
--- a/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetector.java
+++ b/Moveable/src/com/myownb3/piranha/core/grid/collision/CollisionDetector.java
@@ -28,8 +28,9 @@ public interface CollisionDetector {
* the new Position after the movement
* @param gridElements2Check
* all {@link GridElement}s which are in reach to collide and which are also 'avoidable'
+ * @return a result about the detection which was made by this {@link CollisionDetector}
*/
- void checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement, Position oldPosition, Position newPosition,
- List gridElements2Check);
+ CollisionDetectionResult checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement, Position oldPosition,
+ Position newPosition, List gridElements2Check);
}
diff --git a/Moveable/src/com/myownb3/piranha/core/grid/gridelement/GridElement.java b/Moveable/src/com/myownb3/piranha/core/grid/gridelement/GridElement.java
index ee51d650..f462a85b 100644
--- a/Moveable/src/com/myownb3/piranha/core/grid/gridelement/GridElement.java
+++ b/Moveable/src/com/myownb3/piranha/core/grid/gridelement/GridElement.java
@@ -7,7 +7,9 @@
import com.myownb3.piranha.core.detector.Detector;
import com.myownb3.piranha.core.grid.Grid;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectedException;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.gridelement.shape.Shape;
import com.myownb3.piranha.core.grid.position.Position;
import com.myownb3.piranha.core.moveables.Moveable;
@@ -85,7 +87,9 @@ public interface GridElement {
/**
* Checks for every given {@link GridElement} if there is a collision when this {@link GridElement} is moving
- * from it's current Position to the new Position
+ * from it's current Position to the new Position.
+ * The returned {@link CollisionDetectionResult} contains further information about any detected collision. Depending on the
+ * {@link CollisionDetectionHandler} it may be thrown a {@link CollisionDetectedException}
*
* @param collisionDetectionHandler
* the {@link CollisionDetectionHandler} which handles the collision if one occurred
@@ -93,8 +97,10 @@ public interface GridElement {
* the new Position after the movement
* @param gridElements2Check
* the {@link GridElement}s to check
+ * @return the result of the collision detection
*/
- void check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition, List gridElements2Check);
+ CollisionDetectionResult check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
+ List gridElements2Check);
/**
* Returns true
if this {@link GridElement} is gridElement or false
if not.
diff --git a/Moveable/src/com/myownb3/piranha/core/grid/gridelement/shape/Shape.java b/Moveable/src/com/myownb3/piranha/core/grid/gridelement/shape/Shape.java
index 0079d461..f45d8ae6 100644
--- a/Moveable/src/com/myownb3/piranha/core/grid/gridelement/shape/Shape.java
+++ b/Moveable/src/com/myownb3/piranha/core/grid/gridelement/shape/Shape.java
@@ -6,7 +6,9 @@
import java.util.List;
import com.myownb3.piranha.core.detector.Detector;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectedException;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.shape.path.PathSegment;
import com.myownb3.piranha.core.grid.position.Position;
@@ -30,17 +32,22 @@ public interface Shape extends Cloneable {
List getPath();
/**
- * Checks for every given {@link GridElement} if there is a collision when the {@link GridElement} of this {@link Shape} is moving
- * from it's current Position to the new Position
+ * Checks for every given {@link GridElement} if there is a collision when this {@link GridElement} is moving
+ * from it's current Position to the new Position.
+ * The returned {@link CollisionDetectionResult} contains further information about any detected collision. Depending on the
+ * {@link CollisionDetectionHandler} it may be thrown a {@link CollisionDetectedException}
*
* @param collisionDetectionHandler
* the {@link CollisionDetectionHandler} which handles the collision if one occurred
* @param newPosition
* the new Position after the movement
* @param gridElements2Check
- * all {@link GridElement}s which are in reach to collide and which are also 'avoidable'
+ * the {@link GridElement}s to check
+ * @return the result of the collision detection
*/
- void check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition, List gridElements2Check);
+ CollisionDetectionResult check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
+ List gridElements2Check);
+
/**
* Evaluates if the {@link GridElement} of this {@link Shape} at the given {@link Position} is in reach to this Shape or it's path to be
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/DefaultGrid.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/DefaultGrid.java
index 22302e0d..0f24984d 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/DefaultGrid.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/DefaultGrid.java
@@ -13,6 +13,7 @@
import java.util.stream.Collectors;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.collision.DefaultCollisionDetectionHandlerImpl;
import com.myownb3.piranha.core.grid.direction.Direction;
import com.myownb3.piranha.core.grid.exception.GridElementOutOfBoundsException;
@@ -111,15 +112,13 @@ public Position moveBackward(GridElement gridElement) {
double newX = getNewXValue(gridElement, direction.getBackwardX());
double newY = getNewYValue(gridElement, direction.getBackwardY());
checkBounds(newX, newY);
- Position newPosition = Positions.of(direction, newX, newY);
- checkCollision(gridElement, newPosition);
-
- return newPosition;
+ CollisionDetectionResult collisionDetectionResult = checkCollision(gridElement, Positions.of(direction, newX, newY));
+ return collisionDetectionResult.getMovedPosition();
}
- private void checkCollision(GridElement gridElement, Position newPosition) {
+ private CollisionDetectionResult checkCollision(GridElement gridElement, Position newPosition) {
List gridElements2Check = getGridElements4CollisionCheckWithinDistanceInternal(gridElement, maxDistance);
- gridElement.check4Collision(collisionDetectionHandler, newPosition, gridElements2Check);
+ return gridElement.check4Collision(collisionDetectionHandler, newPosition, gridElements2Check);
}
/**
@@ -137,10 +136,8 @@ public Position moveForward(GridElement gridElement) {
double newX = getNewXValue(gridElement, direction.getForwardX());
double newY = getNewYValue(gridElement, direction.getForwardY());
checkBounds(newX, newY);
- Position newPosition = Positions.of(direction, newX, newY);
- checkCollision(gridElement, newPosition);
-
- return newPosition;
+ CollisionDetectionResult collisionDetectionResult = checkCollision(gridElement, Positions.of(direction, newX, newY));
+ return collisionDetectionResult.getMovedPosition();
}
@Override
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionResultImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionResultImpl.java
new file mode 100644
index 00000000..ce772295
--- /dev/null
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/CollisionDetectionResultImpl.java
@@ -0,0 +1,24 @@
+package com.myownb3.piranha.core.grid.collision;
+
+import com.myownb3.piranha.core.grid.position.Position;
+
+public class CollisionDetectionResultImpl implements CollisionDetectionResult {
+
+ private Position movedPosition;
+ private boolean isCollision;
+
+ public CollisionDetectionResultImpl(boolean isCollision, Position movedPosition) {
+ this.isCollision = isCollision;
+ this.movedPosition = movedPosition;
+ }
+
+ @Override
+ public Position getMovedPosition() {
+ return movedPosition;
+ }
+
+ @Override
+ public boolean isCollision() {
+ return isCollision;
+ }
+}
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/DefaultCollisionDetectionHandlerImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/DefaultCollisionDetectionHandlerImpl.java
index 73ef5d4c..1da57962 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/DefaultCollisionDetectionHandlerImpl.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/collision/DefaultCollisionDetectionHandlerImpl.java
@@ -1,13 +1,12 @@
package com.myownb3.piranha.core.grid.collision;
-import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.position.Position;
public class DefaultCollisionDetectionHandlerImpl implements CollisionDetectionHandler {
@Override
- public void handleCollision(GridElement otherGridElement, GridElement movedGridElement, Position newPosition) {
+ public CollisionDetectionResult handleCollision(GridElement otherGridElement, GridElement movedGridElement, Position newPosition) {
throw new CollisionDetectedException("Collision with GridElement '" + otherGridElement.getPosition()
+ "' and the moved GridElement '" + movedGridElement + "', on Position x='" + newPosition.getX() + "', y='" + newPosition.getY() + "'");
}
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/AbstractGridElement.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/AbstractGridElement.java
index b0564bb0..077b32f0 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/AbstractGridElement.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/AbstractGridElement.java
@@ -8,6 +8,7 @@
import com.myownb3.piranha.core.detector.Detector;
import com.myownb3.piranha.core.grid.Grid;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.gridelement.shape.AbstractShape;
import com.myownb3.piranha.core.grid.gridelement.shape.Shape;
import com.myownb3.piranha.core.grid.gridelement.shape.position.PositionShape.PositionShapeBuilder;
@@ -73,9 +74,9 @@ public void isDetectedBy(Position detectorPosition, Detector detector) {
}
@Override
- public void check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
+ public CollisionDetectionResult check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
List gridElements2Check) {
- shape.check4Collision(collisionDetectionHandler, newPosition, gridElements2Check);
+ return shape.check4Collision(collisionDetectionHandler, newPosition, gridElements2Check);
}
@Override
@@ -121,6 +122,10 @@ public String getName() {
return name;
}
+ public void setPosition(Position position) {
+ this.position = position;
+ }
+
public abstract static class AbstractGridElementBuilder {
protected Position position;
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/CircleImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/CircleImpl.java
index e1403149..85d0ec07 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/CircleImpl.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/CircleImpl.java
@@ -11,6 +11,7 @@
import java.util.stream.Collectors;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.position.Positions;
@@ -44,9 +45,10 @@ protected CollisionDetector buildCollisionDetector() {
}
@Override
- public void check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
+ public CollisionDetectionResult check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
List gridElements2Check) {
- collisionDetector.checkCollision(collisionDetectionHandler, gridElement, null/*old value not necessary*/, newPosition, gridElements2Check);
+ return collisionDetector.checkCollision(collisionDetectionHandler, gridElement, null/*old value not necessary*/, newPosition,
+ gridElements2Check);
}
@Override
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/detection/CircleCollisionDetectorImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/detection/CircleCollisionDetectorImpl.java
index 60de5f65..3cbabbba 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/detection/CircleCollisionDetectorImpl.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/circle/detection/CircleCollisionDetectorImpl.java
@@ -3,6 +3,8 @@
import java.util.List;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResultImpl;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.shape.Shape;
import com.myownb3.piranha.core.grid.gridelement.shape.circle.Circle;
@@ -25,12 +27,14 @@ public CircleCollisionDetectorImpl(Circle circle) {
}
@Override
- public void checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement, Position oldPosition,
- Position newPosition, List gridElements2Check) {
+ public CollisionDetectionResult checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement,
+ Position oldPosition, Position newPosition, List gridElements2Check) {
Shape ourCircleAtNewPos = getOurShapeAtNewPos(newPosition, circle);
- gridElements2Check.stream()
+ return gridElements2Check.stream()
.filter(isGridElementsInsideOrOnShape(newPosition, ourCircleAtNewPos))
- .forEach(handleCollision(collisionDetectionHandler, newPosition, movedGridElement));
+ .findFirst()
+ .map(handleCollision(collisionDetectionHandler, newPosition, movedGridElement))
+ .orElse(new CollisionDetectionResultImpl(false, newPosition));
}
private static Shape getOurShapeAtNewPos(Position newPosition, Shape shape) {
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/detection/AbstractCollisionDetector.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/detection/AbstractCollisionDetector.java
index 97b2bf5f..fe06651c 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/detection/AbstractCollisionDetector.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/detection/AbstractCollisionDetector.java
@@ -5,11 +5,12 @@
import java.util.Comparator;
import java.util.List;
-import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.Predicate;
import com.myownb3.piranha.core.grid.Grid;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.collision.Intersection;
import com.myownb3.piranha.core.grid.collision.IntersectionImpl;
@@ -33,8 +34,8 @@ protected AbstractCollisionDetector() {
margin = 1d / Moveable.STEP_WITDH;
}
- protected Consumer super GridElement> handleCollision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
- GridElement movedGridElement) {
+ protected Function super GridElement, CollisionDetectionResult> handleCollision(CollisionDetectionHandler collisionDetectionHandler,
+ Position newPosition, GridElement movedGridElement) {
return otherGridElement -> collisionDetectionHandler.handleCollision(otherGridElement, movedGridElement, newPosition);
}
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionCollisionDetectorImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionCollisionDetectorImpl.java
index 2fd57b82..dad02e4a 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionCollisionDetectorImpl.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionCollisionDetectorImpl.java
@@ -13,11 +13,12 @@
import com.myownb3.piranha.core.grid.Grid;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResultImpl;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.shape.detection.AbstractCollisionDetector;
import com.myownb3.piranha.core.grid.position.Position;
-import com.myownb3.piranha.util.vector.VectorUtil;
/**
* The {@link PositionCollisionDetectorImpl} implements the {@link CollisionDetector}. It is able to check if a {@link Position} has
@@ -36,12 +37,14 @@ private PositionCollisionDetectorImpl(int collisionDistance) {
}
@Override
- public void checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement, Position oldPosition,
- Position newPosition, List gridElements2Check) {
- Float64Vector lineFromOldToNew = VectorUtil.getVector(oldPosition.getDirection());
- gridElements2Check.stream()
+ public CollisionDetectionResult checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement,
+ Position oldPosition, Position newPosition, List gridElements2Check) {
+ Float64Vector lineFromOldToNew = oldPosition.getDirection().getVector();
+ return gridElements2Check.stream()
.filter(isCollision(oldPosition, newPosition, lineFromOldToNew))
- .forEach(handleCollision(collisionDetectionHandler, newPosition, movedGridElement));
+ .findFirst()
+ .map(handleCollision(collisionDetectionHandler, newPosition, movedGridElement))
+ .orElse(new CollisionDetectionResultImpl(false, newPosition));
}
private Predicate super GridElement> isCollision(Position oldPosition, Position newPosition, Float64Vector lineFromOldToNew) {
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionShape.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionShape.java
index 3f4ac76c..1ee34d1f 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionShape.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/position/PositionShape.java
@@ -10,6 +10,7 @@
import com.myownb3.piranha.core.detector.Detector;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.shape.AbstractShape;
@@ -50,9 +51,10 @@ protected List buildPath4Detection() {
}
@Override
- public void check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition, List gridElements2Check) {
+ public CollisionDetectionResult check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
+ List gridElements2Check) {
// Since the 'newPosition' is already transformed, we can call the detector directly
- collisionDetector.checkCollision(collisionDetectionHandler, gridElement, getPosition(), newPosition, gridElements2Check);
+ return collisionDetector.checkCollision(collisionDetectionHandler, gridElement, getPosition(), newPosition, gridElements2Check);
}
@Override
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImpl.java
index 2a335a0b..2ccb47a5 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImpl.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImpl.java
@@ -16,6 +16,7 @@
import org.jscience.mathematics.vector.Float64Vector;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.position.Positions;
@@ -56,8 +57,9 @@ protected CollisionDetector buildCollisionDetector() {
}
@Override
- public void check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition, List gridElements2Check) {
- collisionDetector.checkCollision(collisionDetectionHandler, gridElement, center, newPosition, gridElements2Check);
+ public CollisionDetectionResult check4Collision(CollisionDetectionHandler collisionDetectionHandler, Position newPosition,
+ List gridElements2Check) {
+ return collisionDetector.checkCollision(collisionDetectionHandler, gridElement, center, newPosition, gridElements2Check);
}
@Override
diff --git a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImpl.java b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImpl.java
index 6520543a..7d60a3c6 100644
--- a/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImpl.java
+++ b/MoveableImpl/src/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImpl.java
@@ -13,6 +13,8 @@
import com.myownb3.piranha.core.grid.Grid;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResultImpl;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.shape.detection.AbstractCollisionDetector;
@@ -38,12 +40,14 @@ private RectangleCollisionDetectorImpl(Rectangle rectangle) {
}
@Override
- public void checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement, Position oldPosition,
- Position newPosition, List gridElements2Check) {
+ public CollisionDetectionResult checkCollision(CollisionDetectionHandler collisionDetectionHandler, GridElement movedGridElement,
+ Position oldPosition, Position newPosition, List gridElements2Check) {
Rectangle transformedRectangle = getTransformedRectangle(newPosition);
- gridElements2Check.stream()
+ return gridElements2Check.stream()
.filter(isCollision(transformedRectangle))
- .forEach(handleCollision(collisionDetectionHandler, newPosition, movedGridElement));
+ .findFirst()
+ .map(handleCollision(collisionDetectionHandler, newPosition, movedGridElement))
+ .orElse(new CollisionDetectionResultImpl(false, newPosition));
}
private Predicate super GridElement> isCollision(Rectangle transformedRectangle) {
diff --git a/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImplTest.java b/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImplTest.java
index cc0d6bdc..25925b9b 100644
--- a/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImplTest.java
+++ b/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/RectangleImplTest.java
@@ -40,8 +40,7 @@ void testCheck4Collision() {
when(rectangle.clone()).thenReturn(rectangle);
// When
- rectangle.check4Collision((a, g, p) -> {
- }, newPosition, Collections.emptyList());
+ rectangle.check4Collision((a, g, p) -> null, newPosition, Collections.emptyList());
// Then
verify(rectangle).clone();
diff --git a/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImplTest.java b/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImplTest.java
index d08f8003..e276df9f 100644
--- a/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImplTest.java
+++ b/MoveableImpl/test/com/myownb3/piranha/core/grid/gridelement/shape/rectangle/detection/RectangleCollisionDetectorImplTest.java
@@ -15,6 +15,7 @@
import org.junit.jupiter.api.Test;
import com.myownb3.piranha.core.grid.collision.CollisionDetectionHandler;
+import com.myownb3.piranha.core.grid.collision.CollisionDetectionResult;
import com.myownb3.piranha.core.grid.collision.CollisionDetector;
import com.myownb3.piranha.core.grid.gridelement.GridElement;
import com.myownb3.piranha.core.grid.gridelement.Obstacle;
@@ -216,8 +217,8 @@ private TestCaseBuilder() {
private TestCaseBuilder withCollisionDetectionHandler() {
CollisionDetectionHandler cDhHandler = new CollisionDetectionHandler() {
@Override
- public void handleCollision(GridElement otherGridElement, GridElement gridElement, Position newPosition) {
- // ok
+ public CollisionDetectionResult handleCollision(GridElement otherGridElement, GridElement gridElement, Position newPosition) {
+ return null;
}
};
diff --git a/MoveableImpl/test/com/myownb3/piranha/core/moveables/ScannerTest.java b/MoveableImpl/test/com/myownb3/piranha/core/moveables/ScannerTest.java
index 79f93774..efd153fa 100644
--- a/MoveableImpl/test/com/myownb3/piranha/core/moveables/ScannerTest.java
+++ b/MoveableImpl/test/com/myownb3/piranha/core/moveables/ScannerTest.java
@@ -37,8 +37,7 @@ void testEvasion_DistanceCloseEnough() {
// We do not care about the detection handler, since this is not part of this
// test
Grid grid = GridBuilder.builder()
- .withCollisionDetectionHandler((a, b, c) -> {
- })
+ .withCollisionDetectionHandler((a, b, c) -> null)
.build();
Obstacle obstacle = ObstacleBuilder.builder()
.withGrid(grid)
@@ -71,8 +70,7 @@ void testEvasion_DistanceCloseEnoughButNotEvasion() {
// We do not care about the detection handler, since this is not part of this
// test
Grid grid = GridBuilder.builder()
- .withCollisionDetectionHandler((a, b, c) -> {
- })
+ .withCollisionDetectionHandler((a, b, c) -> null)
.build();
GridElement gridElement = SimpleGridElementBuilder.builder()
.withGrid(grid)