コード例 #1
0
 void SetNodeType(NodeMass mass, Node[,] grid, NodeType newType)
 {
     foreach (var node in mass.Mass)
     {
         node.Type = newType;
         if (newType == NodeType.Air)
         {
             node.Solid = false;
         }
         else if (newType == NodeType.Land)
         {
             node.Solid = true;
         }
     }
 }
コード例 #2
0
        NodeMass FillNodeType(Queue <Node> q, Node[,] grid, Node first)
        {
            NodeType massType = NodeType.Null;

            if (first.Solid)
            {
                massType = NodeType.Floating;
            }
            else if (!first.Solid && first.Position.y == 0)
            {
                massType = NodeType.WaterCave;
            }
            else if (!first.Solid)
            {
                massType = NodeType.Cave;
            }

            List <Node> massList = new List <Node>();

            first.InRegion = true;
            while (q.Count > 0)
            {
                Node C = q.Dequeue();
                Node N = GetNeighbourNode(C, grid, Vector2Int.up);
                Node S = GetNeighbourNode(C, grid, Vector2Int.down);
                Node E = GetNeighbourNode(C, grid, Vector2Int.right);
                Node W = GetNeighbourNode(C, grid, Vector2Int.left);
                if (N && N.Solid == C.Solid && !N.InRegion)
                {
                    N.Type = C.Type;
                    q.Enqueue(N);
                    N.InRegion = true;
                    massList.Add(N);
                }
                if (S && S.Solid == C.Solid && !S.InRegion)
                {
                    S.Type = C.Type;
                    q.Enqueue(S);
                    S.InRegion = true;
                    massList.Add(S);
                }
                if (E && E.Solid == C.Solid && !E.InRegion)
                {
                    E.Type = C.Type;
                    q.Enqueue(E);
                    E.InRegion = true;
                    massList.Add(E);
                }
                if (W && W.Solid == C.Solid && !W.InRegion)
                {
                    W.Type = C.Type;
                    q.Enqueue(W);
                    W.InRegion = true;
                    massList.Add(W);
                }
                if (!N || !S || !E || !W)
                {
                    if (C.Solid && IsTouchingGround(C))
                    {
                        massType = NodeType.Land;
                    }
                    else if (!C.Solid && IsTouchingAir(C))
                    {
                        massType = NodeType.Air;
                    }
                }
            }

            foreach (var node in massList)
            {
                if (node != null)
                {
                    node.Type = massType;
                }
            }
            NodeMass nodeMass = new NodeMass(massList, first.Solid, massType, massList.Count);

            return(nodeMass);
        }
コード例 #3
0
 NodeType GetMassType(NodeMass mass)
 {
     return(mass.Type);
 }
コード例 #4
0
        //Node[,] TrimGrid(Node[,] oldGrid, int amount = 0)
        //{
        //    if(amount == 0)
        //    {
        //        amount = (int)(height * (1 - Flatness) + 1);
        //    }
        //    int newHeight = height - amount + 10;
        //    Node[,] newGrid = new Node[width, newHeight];

        //    for (int x = 0; x < width; x++)
        //    {
        //        for (int y = 0; y < height; y++)
        //        {
        //            if (y < newHeight)
        //                newGrid[x, y] = oldGrid[x, y];
        //        }
        //    }
        //    height = newHeight;
        //    return newGrid;
        //}
        #endregion

        #region Node regions

        Node[,] SetNodeTypes(Node[,] grid)
        {
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    Node node = grid[x, y];
                    if (node.Type == NodeType.Null)
                    {
                        //Debug.LogFormat("Node to fill {0}", node);
                        Queue <Node> q = new Queue <Node>();
                        q.Enqueue(node);
                        //Node[,] mass = FillNodeType(q, grid, node);
                        NodeMass mass = FillNodeType(q, grid, node);
                        Masses.Add(mass);
                        //if (GetMassType(mass) == NodeType.Floating)
                        //    if (EraseFloatingAndCaves) SetNodeType(mass, grid, NodeType.Air);
                        //    else SetNodeType(mass, grid, NodeType.Land);
                        //else if (GetMassType(mass) == NodeType.Cave)
                        //    if (EraseFloatingAndCaves) SetNodeType(mass, grid, NodeType.Land);
                        //    else SetNodeType(mass, grid, NodeType.Air);
                    }
                }
            }
            List <NodeMass> toDelete = new List <NodeMass>();

            foreach (var mass in Masses)
            {
                //Debug.Log(mass);
                if (mass.Solid == true && mass.Type == NodeType.Floating)
                {
                    if (mass.Size < DeleteMassThreshold)
                    {
                        foreach (var node in mass.Mass)
                        {
                            node.Solid = false;
                            node.Type  = NodeType.Air;
                        }
                        toDelete.Add(mass);
                    }
                    else
                    {
                        foreach (var node in mass.Mass)
                        {
                            node.Type = NodeType.Land;
                        }
                        mass.Type = NodeType.Land;
                    }
                }
                //if(mass.Solid == false && mass.Type == NodeType.Cave)
                //{
                //	foreach (var node in mass.Mass)
                //	{
                //		node.Type = NodeType.Air;
                //	}
                //	mass.Type = NodeType.Air;
                //}
            }
            foreach (var mass in toDelete)
            {
                Masses.Remove(mass);
            }
            return(null);
        }