package com.corosus.game.ai.pathfind; import com.badlogic.gdx.ai.pfa.indexed.DefaultIndexedGraph; import com.corosus.game.ai.pathfind.node.FlatTiledNode; public class FlatTiledGraph extends DefaultIndexedGraph<FlatTiledNode> implements TiledGraph<FlatTiledNode> { //TODO: static sizes, must fix for multiple level handling public static int sizeX; public static int sizeY; public boolean diagonal; public FlatTiledNode startNode; public FlatTiledGraph (int levelTileSizeX, int levelTileSizeY) { super(levelTileSizeX * levelTileSizeY); sizeX = levelTileSizeX; sizeY = levelTileSizeY; this.diagonal = false; this.startNode = null; } @Override public void init (int[][] data) { int map[][] = data; for (int x = 0; x < sizeX; x++) { for (int y = 0; y < sizeY; y++) { nodes.add(new FlatTiledNode(x, y, map[x][y], 4)); } } // Each node has up to 4 neighbors, therefore no diagonal movement is possible for (int x = 0; x < sizeX; x++) { int idx = x * sizeY; for (int y = 0; y < sizeY; y++) { FlatTiledNode n = nodes.get(idx + y); if (x > 0) addConnection(n, -1, 0); if (y > 0) addConnection(n, 0, -1); if (x < sizeX - 1) addConnection(n, 1, 0); if (y < sizeY - 1) addConnection(n, 0, 1); } } } @Override public FlatTiledNode getNode (int x, int y) { return nodes.get(x * sizeY + y); } @Override public FlatTiledNode getNode (int index) { return nodes.get(index); } private void addConnection (FlatTiledNode n, int xOffset, int yOffset) { FlatTiledNode target = getNode(n.x + xOffset, n.y + yOffset); if (target.type == FlatTiledNode.TILE_FLOOR) n.getConnections().add(new FlatTiledConnection(this, n, target)); } }