public Troop(int troops, GraphPath<Tile> path) { this.troops = troops; this.path = new DefaultGraphPath<>(); for (Tile tile : path) { this.path.add(tile); } texture = Assets.TROOP; setSize(texture.getRegionWidth(), texture.getRegionHeight()); label = new ConquestLabel(this.troops, getX(), getY(), getWidth(), getHeight()); setOrigin(Align.center); createActions(); }
@Test public void searchNodePath_WhenDestinationUnreachable_ExpectedNoOuputPathFound () { // @off - disable libgdx formatter final String graphDrawing = ".....#....\n" + ".....#....\n" + ".....#...."; // @on - enable libgdx formatter final MyGraph graph = createGraphFromTextRepresentation(graphDrawing); final IndexedAStarPathFinder<MyNode> pathfinder = new IndexedAStarPathFinder<>(graph); final GraphPath<MyNode> outPath = new DefaultGraphPath<>(); // @off - disable libgdx formatter // 0123456789 // S....#...E 0 // .....#.... 10 // .....#.... 20 // @on - enable libgdx formatter final boolean searchResult = pathfinder.searchNodePath(graph.nodes.get(0), graph.nodes.get(9), new ManhattanDistance(), outPath); Assert.assertFalse("Unexpected search result", searchResult); }
private void generatePath(GraphPath<GridNode> resultPath) { // @TODO replace legacy usage of GridCell. final LinkedList<GridNode> cells = new LinkedList<>(); for (Object node : resultPath) { cells.add(new GridNode(((GridNode) node).x, ((GridNode) node).y)); } ArrayList<GridNode> reversedCells = new ArrayList<>(cells); Collections.reverse(reversedCells); final Path toDestination = new Path(new SafeEntityReference(b), cells, team, false); final Path toSource = new Path(new SafeEntityReference(a), reversedCells, team, true); entityA().paths.get(team).add(toDestination); entityB().paths.get(team).add(toSource); }
public TileCoordinate getNextTarget(final TileCoordinate location, final TileCoordinate destination) { final GraphPath<Connection<TileCoordinate>> path = new DefaultGraphPath<>(); pathFinder.searchConnectionPath( graph.getCachedNode(location), graph.getCachedNode(destination), heuristic, path ); return path.getCount() == 0 ? null : path.get(0).getToNode(); }
@Override public boolean searchConnectionPath (N startNode, N endNode, Heuristic<N> heuristic, GraphPath<Connection<N>> outPath) { // Perform AStar boolean found = search(startNode, endNode, heuristic); if (found) { // Create a path made of connections generateConnectionPath(startNode, outPath); } return found; }
@Override public boolean searchNodePath (N startNode, N endNode, Heuristic<N> heuristic, GraphPath<N> outPath) { // Perform AStar boolean found = search(startNode, endNode, heuristic); if (found) { // Create a path made of nodes generateNodePath(startNode, outPath); } return found; }
protected void generateConnectionPath (N startNode, GraphPath<Connection<N>> outPath) { // Work back along the path, accumulating connections // outPath.clear(); while (current.node != startNode) { outPath.add(current.connection); current = nodeRecords[graph.getIndex(current.connection.getFromNode())]; } // Reverse the path outPath.reverse(); }
protected void generateNodePath (N startNode, GraphPath<N> outPath) { // Work back along the path, accumulating nodes // outPath.clear(); while (current.connection != null) { outPath.add(current.node); current = nodeRecords[graph.getIndex(current.connection.getFromNode())]; } outPath.add(startNode); // Reverse the path outPath.reverse(); }
public static void main(String[] args) { // @off - disable libgdx formatter final String graphDrawing = ".....#....\n" + ".....#....\n" + ".....#...."; // @on - enable libgdx formatter final MyGraph graph = createGraphFromTextRepresentation(graphDrawing); final IndexedAStarPathFinder<MyNode> pathfinder = new IndexedAStarPathFinder<MyNode>(graph); final GraphPath<MyNode> outPath = new DefaultGraphPath<MyNode>(); // @off - disable libgdx formatter // 0123456789 // S....#...E 0 // .....#.... 10 // .....#.... 20 // @on - enable libgdx formatter final boolean searchResult = pathfinder.searchNodePath(graph.getNodes().get(0), graph.getNodes().get(20), new ManhattanDistance(), outPath); System.out.println(""+searchResult); System.out.println(""+outPath.getCount()); for(int i=0;i<outPath.getCount();i++){ System.out.println(""+outPath.get(i)); } }
/** Smoothes the given path in place. * @param outPath the path to smooth * @return the number of nodes removed from the path. */ public int smoothPath (GraphPath<MyNode> outPath) { int inputPathLength = outPath.getCount(); // If the path is two nodes long or less, then we can't smooth it if (inputPathLength <= 2) return 0; // Make sure the ray is instantiated if (this.ray == null) { this.ray = new MyRay(outPath.get(0), outPath.get(0)); } // Keep track of where we are in the smoothed path. // We start at 1, because we must always include the start node in the smoothed path. int outputIndex = 1; // Keep track of where we are in the input path // We start at 2, because we assume two adjacent // nodes will pass the ray cast int inputIndex = 2; // Loop until we find the last item in the input while (inputIndex < inputPathLength) { // Set the ray ray.start = (outPath.get(outputIndex - 1)); ray.end = (outPath.get(inputIndex)); // Do the ray cast boolean collides = raycastCollisionDetector.collides(ray); if (collides) { // The ray test failed, swap nodes and consider the next output node outPath.swapNodes(outputIndex, inputIndex - 1); outputIndex++; } // Consider the next input node inputIndex++; } // Reached the last input node, always add it to the smoothed path. outPath.swapNodes(outputIndex, inputIndex - 1); outPath.truncatePath(outputIndex + 1); // Return the number of removed nodes return inputIndex - outputIndex - 1; }
public void touchToMove(int screenX, int screenY) { Vector3 input = new Vector3(screenX, screenY, 0); camera.unproject(input); int x = MathUtils.floor(input.x / 32); int y = MathUtils.floor(input.y / 32); Gdx.app.debug(TAG, "clicked # (x:" + x + ",y:" + y + " )"); //we click not npc or block,set aim to move if (!isCollisionWithNpc(x, y) && !isCollisionWithBlock(x, y)) { //A* path finding path.clear(); Vector2 start = new Vector2(MathUtils.round(player.getX() / 32), MathUtils.round(player.getY() / 32)); //we need set exactly start position Vector2 end = new Vector2(x, y); int numCols = mapMgr.cols; int numRows = mapMgr.rows; Gdx.app.debug(TAG, "From:" + start + " to " + end + "|numCols:" + numCols + "|numRows:" + numRows); int s = (int) start.x + ((int) start.y) * numCols; int t = (int) end.x + ((int) (end.y)) * numCols; List<Sprite> temp = new ArrayList<Sprite>(); temp.addAll(mapMgr.npcs); temp.addAll(mapMgr.enemies); // temp.addAll(mapMgr.events); final MyGraph graph = GraphGenerator.generateGraph(mapMgr.getBlockLayer(), temp, numCols, numRows, 32, 32, start); final IndexedAStarPathFinder<MyNode> pathfinder = new IndexedAStarPathFinder<MyNode>(graph); final GraphPath<MyNode> outPath = new DefaultGraphPath<MyNode>(); final boolean searchResult = pathfinder.searchNodePath(graph.getNodes().get(s), graph.getNodes().get(t), new ManhattanDistance(), outPath); MyPathSmoother pathSmoother = new MyPathSmoother(new MyRaycastCollisionDetector(graph)); pathSmoother.smoothPath(outPath); StringBuilder sb = new StringBuilder(); for (int i = outPath.getCount() - 1; i >= 0; i--) { sb.append("(" + outPath.get(i).getX() + "," + outPath.get(i).getY() + ")|"); path.add(outPath.get(i)); } if (searchResult) { Gdx.app.debug(TAG, "Start Follow Path:" + sb.toString()); player.followPath(path); aim = new Aim(x, y); } } else { aim = null; } }
@Test public void searchNodePath_WhenSearchingAdjacentTile_ExpectedOuputPathLengthEquals2 () { // @off - disable libgdx formatter final String graphDrawing = "..........\n" + "..........\n" + ".........."; // @on - enable libgdx formatter final MyGraph graph = createGraphFromTextRepresentation(graphDrawing); final IndexedAStarPathFinder<MyNode> pathfinder = new IndexedAStarPathFinder<>(graph); final GraphPath<MyNode> outPath = new DefaultGraphPath<>(); // @off - disable libgdx formatter // 0123456789 // .......... 0 // .....S.... 10 // .....E.... 20 // @on - enable libgdx formatter final boolean searchResult1 = pathfinder.searchNodePath(graph.nodes.get(15), graph.nodes.get(25), new ManhattanDistance(), outPath); Assert.assertTrue("Unexpected search result", searchResult1); Assert.assertEquals("Unexpected number of nodes in path", 2, outPath.getCount()); // @off - disable libgdx formatter // 0123456789 // .......... 0 // .....SE... 10 // .......... 20 // @on - enable libgdx formatter outPath.clear(); final boolean searchResult2 = pathfinder.searchNodePath(graph.nodes.get(15), graph.nodes.get(16), new ManhattanDistance(), outPath); Assert.assertTrue("Unexpected search result", searchResult2); Assert.assertEquals("Unexpected number of nodes in path", 2, outPath.getCount()); // @off - disable libgdx formatter // 0123456789 // .......... 0 // ....ES.... 10 // .......... 20 // @on - enable libgdx formatter outPath.clear(); final boolean searchResult3 = pathfinder.searchNodePath(graph.nodes.get(15), graph.nodes.get(14), new ManhattanDistance(), outPath); Assert.assertTrue("Unexpected search result", searchResult3); Assert.assertEquals("Unexpected number of nodes in path", 2, outPath.getCount()); // @off - disable libgdx formatter // 0123456789 // .....E.... 0 // .....S.... 10 // .......... 20 // @on - enable libgdx formatter outPath.clear(); final boolean searchResult4 = pathfinder.searchNodePath(graph.nodes.get(15), graph.nodes.get(5), new ManhattanDistance(), outPath); Assert.assertTrue("Unexpected search result", searchResult4); Assert.assertEquals("Unexpected number of nodes in path", 2, outPath.getCount()); }
@Test public void searchNodePath_WhenSearchCanHitDeadEnds_ExpectedOuputPathFound () { // @off - disable libgdx formatter final String graphDrawing = ".#.#.......#..#...............\n" + ".#............#.....#..#####..\n" + "...#.#######..#.....#.........\n" + ".#.#.#........#.....########..\n" + ".###.#....#####.....#......##.\n" + ".#...#....#.........#...##....\n" + ".#####....#.........#....#....\n" + ".#........#.........#....#####\n" + ".####....##.........#......#..\n" + "....#...............#......#.."; // @on - enable libgdx formatter final MyGraph graph = createGraphFromTextRepresentation(graphDrawing); final IndexedAStarPathFinder<MyNode> pathfinder = new IndexedAStarPathFinder<>(graph); final GraphPath<MyNode> outPath = new DefaultGraphPath<>(); // @off - disable libgdx formatter // 012345678901234567890123456789 // S#.#.......#..#............... 0 // .#............#.....#..#####.. 30 // ...#.#######..#.....#......... 60 // .#.#.#........#.....########.. 90 // .###.#....#####.....#......##. 120 // .#...#....#.........#...##.... 150 // .#####....#.........#....#.... 180 // .#E.......#.........#....##### 210 // .####....##.........#......#.. 240 // ....#...............#......#.. 270 // @on - enable libgdx formatter final boolean searchResult = pathfinder.searchNodePath(graph.nodes.get(0), graph.nodes.get(212), new ManhattanDistance(), outPath); Assert.assertTrue("Unexpected search result", searchResult); Assert.assertEquals("Unexpected number of nodes in path", 32, outPath.getCount()); }