public ColapseNode next() { if (iterator >= (queue.Count - 1)) { iterator = 0; } else { iterator++; } if (queue.Count == 0) { Debug.LogError("Queue vazia!"); return(null); } if (queue[iterator].Count > 0) { ColapseNode aux = queue[iterator][0]; queue[iterator].RemoveAt(0); return(aux); } queue.RemoveAt(iterator); return(next()); }
public void toCheck(ColapseNode node) { foreach (List <ColapseNode> list in queue) { list.Find( elem => { return(elem.pos == node.pos); } ); } }
public void add(ColapseNode node) { int i; for (i = 0; i < queue.Count; i++) { if (queue[iterator][i].totalDistance > node.totalDistance) { break; } } queue[iterator].Insert(i, node); }
public UnitQueue(List <Vector2Int> unities, Vector2Int target) { if (unities.Count == 0 || target == null) { Debug.LogError("unidades ou posicao alvo invalidas"); return; } queue = new List <List <ColapseNode> >(); foreach (Vector2Int unit in unities) { List <ColapseNode> listAux = new List <ColapseNode>(); ColapseNode nodeAux = new ColapseNode(unit, null, target); listAux.Add(nodeAux); queue.Add(listAux); } iterator = queue.Count; }
public ColapseNode(Vector2Int pos, ColapseNode parent, Vector2Int endingPos) { this.pos = pos; //this.parent = new List<AStarNode>(); this.parent = parent; heuristicDistance = Mathf.Sqrt(Mathf.Pow(pos.x - endingPos.x, 2) + Mathf.Pow(pos.y - endingPos.y, 2)); if (parent != null) { //this.parent.Add(parent); realDistance = parent.realDistance + Mathf.Sqrt(Mathf.Pow(pos.x - parent.pos.x, 2) + Mathf.Pow(pos.y - parent.pos.y, 2)); totalDistance = realDistance + heuristicDistance; } else { totalDistance = heuristicDistance; } }
public void PathfinderColapso() { if (_targetPos == null || _unitiesToTest == null || _unitiesToTest.Count == 0) { Debug.LogError("Selecione um teste!"); return; } List <ColapseNode> checkedList = new List <ColapseNode>(); UnitQueue unitQueue = new UnitQueue(_unitiesToTest, _targetPos); ColapseNode nodeAtual = unitQueue.next(); while (nodeAtual != null) { //foreach (var neighbour in neighbourAux) { // Vector2Int posAux = nodeAtual.pos + neighbour; // if (posAux == _targetPos) { // print("Encontrado!"); // List<Vector2Int> caminhoFinal = new List<Vector2Int>(); // caminhoFinal.Add(posAux); // caminhoFinal.Add(nodeAtual.pos); // auxNode = nodeAtual.parent; // while (auxNode != null) { // caminhoFinal.Add(auxNode.pos); // auxNode = auxNode.parent; // } // caminhoFinal.Reverse(); // foreach (var elem in caminhoFinal) { // print(elem); // //Instantiate(DebugPathMark, new Vector3(elem.x, elem.y, -2f), Quaternion.identity, transform); // } // for (int i = 1; i < caminhoFinal.Count; i++) { // Debug.DrawLine( // new Vector3(caminhoFinal[i - 1].x, caminhoFinal[i - 1].y, 0f), // new Vector3(caminhoFinal[i].x, caminhoFinal[i].y, 0f), // Color.blue, // 30); // } // return; // } // TileType tileType = TileMapController.Instance.ValidTile(posAux); // if (tileType == TileType.Pathable) { // auxNode = new AStarNode(posAux, nodeAtual, _targetPos); // var auxAuxNode1 = toCheckList.Find(x => { // if (x.pos == auxNode.pos) { // return x.totalDistance < auxNode.totalDistance; // } // return false; // }); // var auxAuxNode2 = checkedList.Find(x => { // if (x.pos == auxNode.pos) { // return x.totalDistance < auxNode.totalDistance; // } // return false; // }); // if (auxAuxNode1 == null && auxAuxNode2 == null) { // unitQueue.add(auxNode); // Instantiate(DebugMark, new Vector3(auxNode.pos.x, auxNode.pos.y, -1f), Quaternion.identity, transform); // } // } else if (tileType == TileType.Blocked) { // // tratamento da pedra // /** // * Expandir e encontrar todos os bloqueios adjecentes, salvar posicao, largura e altura da pedra // */ // FindObstacleByTile(posAux); // } //} //checkedList.Add(nodeAtual); nodeAtual = unitQueue.next(); } // Botar uma lista pra cada unidade e só botar a melhor opcao de cada uma na fila pro proximo ciclo? // Isso + o colapso pode fazer bem menos choques de checks }