/// <summary> /// Returns a preconfigured <see cref="Array2D{TItem}"/> which can be used to make a <see cref="DefinitionNodeGrid"/> /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="generateNodeGridConnections"></param> /// <returns></returns> public static Array2D <DefinitionNode> GeneratePreFilledArray(GenerateNodeGridConnections generateNodeGridConnections, int width, int height) { var array = new Array2D <DefinitionNode>(width, height); for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var worldPosition = new Vector2(x, y); var i = width * y + x; var node = new DefinitionNode(i, worldPosition, 1); array[x, y] = node; } } if (generateNodeGridConnections != GenerateNodeGridConnections.None) { for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var node = array[x, y]; var neighbours = GetNeighbours(array, x, y, generateNodeGridConnections); foreach (var neighbour in neighbours) { node.Connections.Add(new NodeConnection(neighbour)); } } } } return(array); }
/// <summary> /// Returns a preconfigured <see cref="Array2D{DefinitionNode}"/> which can be used to make a <see cref="DefinitionNodeGrid"/> /// </summary> /// <param name="width"></param> /// <param name="height"></param> /// <param name="generateNodeGridConnections"></param> /// <param name="nodeGridCollisionLayers"></param> /// <param name="crossCorners"></param> /// <returns></returns> public Array2D <DefinitionNode> GeneratePreFilledArray(GenerateNodeGridConnections generateNodeGridConnections, int width, int height, NodeGridCollisionMask nodeGridCollisionLayers = null, bool crossCorners = false) { var array = new Array2D <DefinitionNode>(width, height); for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var worldPosition = new Vector2(x, y); if (generateNodeGridConnections == GenerateNodeGridConnections.None) { array[x, y] = new DefinitionNode(worldPosition); } else { var connections = GetNeighbours(width, height, x, y, generateNodeGridConnections, nodeGridCollisionLayers, crossCorners); array[x, y] = new DefinitionNode(worldPosition, connections: connections); } } } return(array); }
private NodeConnection[] GetNeighbours(int width, int height, int fromX, int fromY, GenerateNodeGridConnections generateNodeGridConnections, NodeGridCollisionMask nodeGridCollisionLayers, bool crossCorners) { var count = 0; for (var y = -1; y <= 1; y++) { for (var x = -1; x <= 1; x++) { if (x == 0 && y == 0) { continue; //Skip the center since this is the node we are adding neighbours to. } var toX = fromX + x; var toY = fromY + y; if (toX >= 0 && toX < width && toY >= 0 && toY < height) { if (generateNodeGridConnections == GenerateNodeGridConnections.NoDiagonal) { if (x == 1 && y == 1 || x == -1 && y == 1 || x == -1 && y == -1 || x == 1 && y == -1) { continue; } } var cat = nodeGridCollisionLayers != null?GetCollisionCategory(nodeGridCollisionLayers, fromX, fromY, toX, toY, crossCorners) : PathfindaxCollisionCategory.None; _connectionBuffer[count] = new NodeConnection(width * toY + toX, cat); count++; } } } var neighbours = new NodeConnection[count]; for (var i = 0; i < neighbours.Length; i++) { neighbours[i] = _connectionBuffer[i]; } return(neighbours); }
public Array2D <DefinitionNode> GeneratePreFilledArray(GenerateNodeGridConnections generateNodeGridConnections, NodeGridCollisionMask nodeGridCollisionLayers, bool crossCorners = false) { return(GeneratePreFilledArray(generateNodeGridConnections, nodeGridCollisionLayers.Width, nodeGridCollisionLayers.Height, nodeGridCollisionLayers, crossCorners)); }
public DefinitionNodeGrid(GenerateNodeGridConnections generateNodeGridConnections, int width, int height, Vector2 scale, Vector2 offset = default(Vector2)) { Transformer = new GridTransformer(new Point2(width, height), scale, offset); NodeGrid = DefinitionNodeGridFactory.GeneratePreFilledArray(generateNodeGridConnections, width, height); }
private static List <NodePointer> GetNeighbours(IReadOnlyArray2D <DefinitionNode> nodeArray, int gridX, int gridY, GenerateNodeGridConnections generateNodeGridConnections) { var neighbours = new List <NodePointer>(); for (var y = -1; y <= 1; y++) { for (var x = -1; x <= 1; x++) { if (x == 0 && y == 0) { continue; //Skip the center since this is the node we are adding neighbours to. } var checkX = gridX + x; var checkY = gridY + y; if (checkX >= 0 && checkX < nodeArray.Width && checkY >= 0 && checkY < nodeArray.Height) { if (generateNodeGridConnections == GenerateNodeGridConnections.NoDiagonal) { if (x == 1 && y == 1 || x == -1 && y == 1 || x == -1 && y == -1 || x == 1 && y == -1) { continue; } } var p = new NodePointer(nodeArray.Width * checkY + checkX); neighbours.Add(p); } } } return(neighbours); }