From 6809c19db45d5cdb40ce28c52a8a86d94f890473 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Fri, 3 Oct 2014 01:58:54 +0200 Subject: Board,SearchBoard: add getFinalPath(getFinalPath(Vector path) --- core/src/ch/asynk/tankontank/engine/Board.java | 50 ++++++++++++++++++++++ .../ch/asynk/tankontank/engine/SearchBoard.java | 4 ++ 2 files changed, 54 insertions(+) diff --git a/core/src/ch/asynk/tankontank/engine/Board.java b/core/src/ch/asynk/tankontank/engine/Board.java index d754883..9b05b9f 100644 --- a/core/src/ch/asynk/tankontank/engine/Board.java +++ b/core/src/ch/asynk/tankontank/engine/Board.java @@ -18,6 +18,7 @@ import com.badlogic.gdx.utils.Pool; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector3; import com.badlogic.gdx.math.GridPoint2; +import com.badlogic.gdx.math.GridPoint3; import com.badlogic.gdx.math.Matrix4; import ch.asynk.tankontank.engine.gfx.Image; @@ -134,6 +135,13 @@ public abstract class Board implements Disposable } }; + private final Pool gridPoint3Pool = new Pool() { + @Override + protected GridPoint3 newObject() { + return new GridPoint3(); + } + }; + protected Config cfg; private Tile[] tiles; protected SearchBoard searchBoard; @@ -393,6 +401,48 @@ public abstract class Board implements Disposable return nodesToSet(paths, points); } + private Orientation getOrientation(SearchBoard.Node from, SearchBoard.Node to) + { + int dx = to.col - from .col; + int dy = to.row - from.row; + + if (dy == 0) { + if (dx > 0) return Orientation.NORTH; + return Orientation.SOUTH; + } + if (dy > 0) { + if (dx > 0) return Orientation.NORTH_WEST; + return Orientation.SOUTH_WEST; + } else { + if (dx > 0) return Orientation.NORTH_EAST; + return Orientation.SOUTH_EAST; + } + } + + public int getFinalPath(Vector path) + { + List> paths = searchBoard.possiblePaths(); + + for (GridPoint3 v : path) + gridPoint3Pool.free(v); + path.clear(); + + if (paths.size() != 1) + return 0; + + Vector nodes = paths.get(0); + SearchBoard.Node prev = nodes.get(nodes.size() - 1); + for (int i = (nodes.size() - 2); i >= 0; i--) { + SearchBoard.Node node = nodes.get(i); + GridPoint3 point = gridPoint3Pool.obtain(); + point.set(node.col, node.row, getOrientation(prev, node).r); + path.add(point); + prev = node; + } + + return path.size(); + } + public boolean hasUnits(GridPoint2 hex) { return getTile(hex.x, hex.y).hasUnits(); diff --git a/core/src/ch/asynk/tankontank/engine/SearchBoard.java b/core/src/ch/asynk/tankontank/engine/SearchBoard.java index 6b5ef26..0fd21e1 100644 --- a/core/src/ch/asynk/tankontank/engine/SearchBoard.java +++ b/core/src/ch/asynk/tankontank/engine/SearchBoard.java @@ -504,7 +504,11 @@ public class SearchBoard possiblePathsFilters.remove(n); else possiblePathsFilters.add(n); + return possiblePaths(); + } + public List> possiblePaths() + { int s = possiblePathsFilters.size(); List> paths = new LinkedList>(); -- cgit v1.1-2-g2b99