Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 public Array2D <DefinitionNode> GeneratePreFilledArray(GenerateNodeGridConnections generateNodeGridConnections, NodeGridCollisionMask nodeGridCollisionLayers, bool crossCorners = false)
 {
     return(GeneratePreFilledArray(generateNodeGridConnections, nodeGridCollisionLayers.Width, nodeGridCollisionLayers.Height, nodeGridCollisionLayers, crossCorners));
 }
Ejemplo n.º 5
0
 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);
 }
Ejemplo n.º 6
0
        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);
        }