Ejemplo n.º 1
0
    // Constrói o caminho até o ponto de destino usando a matriz de parentesco
    public void DrawPath(Vector2Int goal)
    {
        TileManager.singleton.ClearPathInstances();
        path.Clear();
        // Posições
        Vector2Int previous = goal;
        Vector2Int cur      = movements.parent[goal.x - movements.startRow, goal.y - movements.startCol];

        // Direções
        VoxelData.MoveDirection previousDir;
        VoxelData.MoveDirection curDir;
        Vector2Int dir;

        // Calcula direção para posicionar seta
        dir = new Vector2Int(previous.x - cur.x, previous.y - cur.y);
        // Insere destino ao caminho
        path.Push(dir);
        // Instancia seta no mapa e define primeira direção
        curDir = VoxelData.GetDirectionIndex(dir);
        TileManager.singleton.InstantiatePathTile(previous, curDir, TileManager.PathEnum.Arrow);

        while (!(cur.x == -1 && cur.y == -1))
        {
            // Atualiza posições
            previous = cur;
            cur      = movements.parent[previous.x - movements.startRow, previous.y - movements.startCol];
            // Critério de parada
            if (!(cur.x == -1 && cur.y == -1))
            {
                // Calcula direção em formato de vetor e recebe o índice correspondente
                previousDir = curDir;
                dir         = new Vector2Int(previous.x - cur.x, previous.y - cur.y);
                curDir      = VoxelData.GetDirectionIndex(dir);
                // Avalia qual será o tile utilizado na posição "previous"
                if (previousDir == curDir)
                {
                    TileManager.singleton.InstantiatePathTile(previous, previousDir, TileManager.PathEnum.Line);
                }
                else
                {
                    VoxelData.MoveDirection tileDir = VoxelData.GetCurveDirection(previousDir, curDir);
                    TileManager.singleton.InstantiatePathTile(previous, tileDir, TileManager.PathEnum.Curve);
                }
                // Armazena posição atual na pilha
                path.Push(dir);
            }
        }
    }