示例#1
0
    private IEnumerator testPathfinding(Vector2 targetPosition)
    {
        ClearPath();
        pathCalculated = false;

        PathfindingNode nodoInicial = new PathfindingNode(redondearPosicion(player.basicMovementServer.characterTransform.position), 0, null, redondearPosicion(targetPosition));

        // Si la posicion a ir esta vacia...
        if (Scenario.scenarioRef.isWalkable(targetPosition))
        {
            // Insertamos el primer nodo en la lista a explorar
            listaNodosAExplorar.Add(nodoInicial);

            // Expandimos nodos hasta que no queden mas... o hayamos encntrado el final
            while (listaNodosAExplorar.Count() > 0 && !pathCalculated)
            {
                GameObject gameObjectDebug = (GameObject)Instantiate(Resources.Load("Prefabs/Debug_Node"));
                gameObjectDebug.GetComponent <DebugIANode>().textoHeu.text  = "h " + listaNodosAExplorar.Peek().heuristicaParcial.ToString();
                gameObjectDebug.GetComponent <DebugIANode>().textoPeso.text = "p " + listaNodosAExplorar.Peek().distance.ToString();
                gameObjectDebug.transform.position = listaNodosAExplorar.Peek().position;

                pathCalculated = listaNodosAExplorar.First().ExpandAll(listaNodosAExplorar, diccionarioNodosExplorados);

                yield return(new WaitForEndOfFrame());
            }

            // Si se ha llegado al final reconstruimos y almacenamos el camino
            if (pathCalculated)
            {
                PathfindingNode nodoFinal = listaNodosAExplorar.First();

                while (nodoFinal.parent != null)
                {
                    AddNewWaypoint(nodoFinal.position);

                    nodoFinal = nodoFinal.parent;
                }
            }
        }
    }
示例#2
0
        static void Main()
        {
            #region Test create list

            // Создание двух односвязных сортированных списков с разной сортировкой:

            SortedNodeList <int> sorterList1 = new SortedNodeList <int>(SortedNodeList <int> .SortedNodeListType.SortAscending)
            {
                5, -15, 10, 1, 9, 4, -5, 1, -20, 50, -11, 0, 6
            };
            SortedNodeList <int> sorterList2 = new SortedNodeList <int>(SortedNodeList <int> .SortedNodeListType.SortDescending)
            {
                5, -15, 10, 1, 9, 4, -5, 1, -20, 50, -11, 0, 6
            };

            //Вывод на экран двух списков

            Console.Write("List sort Ascending: ");
            PrintList(sorterList1);
            Console.WriteLine();
            Console.Write("List sort Descending: ");
            PrintList(sorterList2);
            Console.WriteLine();

            #endregion

            #region Add and remove test

            sorterList1.Add(-101);
            sorterList2.Add(-102);

            sorterList1.RemoveElement(10);
            sorterList2.RemoveElement(10);

            Console.Write("List one: ");
            PrintList(sorterList1);
            Console.WriteLine();
            Console.Write("List two: ");
            PrintList(sorterList2);
            Console.WriteLine();



            #endregion



            Console.WriteLine("Finish");
            Console.ReadLine();
        }
示例#3
0
        public static SortedNodeList <Node> GetChildren(Node node)
        {
            SortedNodeList <Node> children = new SortedNodeList <Node>();

            if (node != null)
            {
                for (int i = 0; i < node.SlotCount; i++)
                {
                    children.Add(node.GetNodeSlot(i));
                }
            }

            return(children);
        }
示例#4
0
    public bool ExpandEach(SortedNodeList listaNodosAExplorar, Dictionary <Vector2, PathfindingNode> diccionarioNodos, Vector2 posicionAExplorar)
    {
        nodoExtraido = null;

        // Primero nos aseguramos de que estemos en una posicion dentro del mapa
        if (Scenario.scenarioRef.isWalkable(posicionAExplorar) && distance < 40)
        {
            diccionarioNodos.TryGetValue(posicionAExplorar, out nodoExtraido);

            // Si es la primera vez que alcanzamos ese nodo...
            if (nodoExtraido == null)
            {
                // Y no es el objetivo la anyadimos a la lista para explorar
                if (posicionAExplorar != targetPosition)
                {
                    nodoCreado = new PathfindingNode(posicionAExplorar, (short)(distance + 1), this);
                    nodoCreado.actualizarPesos();
                    listaNodosAExplorar.Add(nodoCreado);
                }
                // Si la posicion es la objetivo la encabezamos en la lista y detenemos la busqueda
                else
                {
                    nodoCreado = new PathfindingNode(posicionAExplorar, (short)(distance + 1), this);
                    listaNodosAExplorar.AddResultAtFirst(nodoCreado);
                    return(true);
                }
            }
            // Si hemos llegado a un caso mejor... reordenamos los punteros
            else if (distance + 1 < nodoExtraido.distance)
            {
                nodoExtraido.distance = (short)(distance + 1);
                nodoExtraido.parent   = this;
                nodoExtraido.actualizarPesos();
            }
        }

        return(false);
    }