Пример #1
0
    /// <summary>
    ///
    /// </summary>
    /// <param name="inicio"></param>
    /// <param name="relacionGanancia"></param>
    /// <param name="grafo"></param>
    /// <param name="gasolina">La gasolina que riene la nave al comenzar el método</param>
    /// <param name="camino"></param>
    /// <param name="distancia"></param>
    private void buscarCamino(SistemaPlanetario inicio, double relacionGanancia, List <AristaSistema> grafo, float gasolina, List <SistemaPlanetario> camino, float distancia, int sondas, double[] materiales)
    {
        inicio.visitado = true;

        RecargarCombustible rc = new RecargarCombustible();

        List <Planeta> planetasTemp = new List <Planeta>();

        planetasTemp = clonarPlanetas(inicio.nodos);
        double[] materialesTemp = clonarMateriales(materiales);

        double rg = relacionGanancia;

        rc.recargarGasolinaYsondas(inicio, ref gasolina, ref sondas, ref materiales, ref rg);
        camino.Add(inicio);



        //int sondasTemp = inicio.recorrido.sondasGlobal;
        rg = calcularRelacionGanancia(inicio, rg, distancia, ref sondas, ref materiales);

        foreach (var item in buscarAdyacentes(inicio, grafo))
        {
            if (!item.visitado)
            {
                float dis = ((new Vector3(inicio.x, inicio.y, inicio.z)) - (new Vector3(item.x, item.y, item.z))).magnitude;
                if (!caminoImposible(dis, gasolina))
                {
                    buscarCamino(item, rg, grafo, gasolina - (dis / Constantes.GASTO_COMBUSTIBLE), camino, dis, sondas, materiales);
                }
            }
        }
        SistemaPlanetario    inicioAux      = inicio;
        List <AristaSistema> grafoDuplicado = clonarGrafo(grafo, ref inicioAux);

        inicio.visitado = false;
        camino.Remove(inicio);



        buscarOrigen(inicioAux, rg, grafoDuplicado, gasolina, sondas, 0, camino, materiales);
        devolverMateriales(inicio.nodos, planetasTemp, ref materiales);
        devolverMaterialesNave(ref materiales, materialesTemp);
    }
Пример #2
0
    public IEnumerator sistemaDeNavegacion(List <SistemaPlanetario> MejorCamino)
    {
        transform.position = new Vector3(MejorCamino[0].x, 0, MejorCamino[0].z);

        lineaPaso.SetPosition(0, new Vector3(MejorCamino[0].x, 0.1f, MejorCamino[0].z));
        int i = 0;

        int               contadorFinal  = 0; //contador para saber si llego a
        Vector3           posInicial     = new Vector3(MejorCamino[0].x, 0, MejorCamino[0].x);
        SistemaPlanetario sistemaInicial = MejorCamino[0];

        foreach (var sistema in MejorCamino)
        {
            if (sistema == sistemaInicial && i != 0)
            {
                break;
            }


            float distancia = (posInicial - new Vector3(sistema.x, 0, sistema.z)).magnitude;
            posInicial = new Vector3(sistema.x, 0, sistema.z);
            if (combustible < (distancia / Constantes.GASTO_COMBUSTIBLE))
            {
                gameOver = true;

                Debug.Log("Todo Esta Perdido");
                Time.timeScale = 0;
                break;
            }

            contadorFinal++;

            lineaPaso.positionCount = i + 1;

            navegacionSistema();


            GameObject circulo = new GameObject();
            circulo.transform.position   = new Vector3(sistema.x, 0, sistema.z);
            circulo.transform.localScale = new Vector3(20, 20, 20);
            GameObject sistemaTemp = new GameObject();
            sistemaTemp.transform.parent        = circulo.transform;
            sistemaTemp.transform.localPosition = new Vector3(0, -2, 0);
            sistemaTemp.transform.localScale    = new Vector3(0.5f, 0.5f, 0.5f);

            Vector3 target = new Vector3(sistema.x, 0, sistema.z);


            float combustibleTemp     = ((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE;
            float combustubleRestante = combustible - ((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE;

            float gastoGasolina = 0;
            int   entra         = 0;
            while ((transform.position - target).magnitude != 0)
            {
                lineaPaso.SetPosition(i, new Vector3(transform.position.x, 0.1f, transform.position.z));
                if (entra <= 1)
                {
                    entra++;

                    gastoGasolina = combustibleTemp * Constantes.GASTO_COMBUSTIBLE - (((transform.position - target).magnitude) * Constantes.GASTO_COMBUSTIBLE);
                }
                combustible -= gastoGasolina;

                float step = velocidadSistemas * Time.deltaTime;
                transform.position = Vector3.MoveTowards(transform.position, target, step);

                Vector3 targetDir = target - transform.position;


                Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0f);
                Debug.DrawRay(transform.position, newDir, Color.red);
                // Move our position a step closer to the target.
                transform.rotation = Quaternion.LookRotation(newDir);

                Vector3 posicion = transform.position + offsetSistema;
                Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, posicion, 0.1f);

                yield return(null);
            }
            i++;//esta es para las lineas
            combustible = combustubleRestante;

            #region RecargarCombustible
            ///Recarga combustible si es posible
            RecargarCombustible rc         = new RecargarCombustible();
            double[]            materiales = new double[4];
            materiales[0] = iridio;
            materiales[1] = paladio;
            materiales[2] = platino;
            materiales[3] = elementoZero;

            double rg = 0;
            rc.recargarGasolinaYsondas(sistema, ref combustible, ref sondas, ref materiales, ref rg);

            iridio       = (float)materiales[0];
            paladio      = (float)materiales[1];
            platino      = (float)materiales[2];
            elementoZero = (float)materiales[3];


            #endregion RecargarCombustible


            GameObject planetaTemp = new GameObject();
            planetaTemp.transform.parent = sistemaTemp.transform;

            if (sistema.recorrido.caminoGlobal.Count > 0)
            {
                planetaTemp.transform.localPosition = new Vector3(sistema.recorrido.caminoGlobal[0].x, 0, sistema.recorrido.caminoGlobal[0].z);
                transform.position = planetaTemp.transform.position;
            }



            foreach (var planeta in sistema.recorrido.caminoGlobal)
            {
                navegacionPlanetas();
                planetaTemp.transform.localPosition = (new Vector3(planeta.x, 0, planeta.z));

                target = planetaTemp.transform.position;

                Vector3 posicion = transform.position + offsetPlanetas;
                Camera.main.transform.position = posicion;

                while ((transform.position - target).magnitude >= 0.1f)
                {
                    float step = velocidadplanetas * Time.deltaTime;
                    transform.position = Vector3.MoveTowards(transform.position, target, step);

                    Vector3 targetDir = target - transform.position;


                    Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0f);
                    Debug.DrawRay(transform.position, newDir, Color.red);
                    // Move our position a step closer to the target.
                    transform.rotation = Quaternion.LookRotation(newDir);

                    posicion = transform.position + offsetPlanetas;
                    Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, posicion, 0.1f);;

                    yield return(null);
                }


                #region EntrarAPlaneta


                Vector3 posiciont = new Vector3(-7, 0, 0);
                Vector3 rotacion  = new Vector3(0, 90, 0);
                Vector3 escala    = new Vector3(0.1f, 0.1f, 0.1f);

                transform.position   += posiciont;
                transform.eulerAngles = rotacion;
                transform.localScale -= escala;


                Vector3 offsetExtraccion = new Vector3(5f, 19, 22);
                // Camera.main.transform.position -= offsetExtraccion;



                if (sondas >= 2 && GastoSondas.valeLaPenaGastarSondas(planeta))
                {
                    Vector3 Posfinal1 = Camera.main.transform.position - offsetExtraccion;

                    while ((Posfinal1 - Camera.main.transform.position).magnitude != 0)
                    {
                        Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, Posfinal1, 1f);
                        yield return(null);
                    }
                    sondas -= 2;
                    double iridioTemp       = planeta.iridio / tiempoExtraccion;
                    double paladioTemp      = planeta.paladio / tiempoExtraccion;
                    double platinoTemp      = planeta.platino / tiempoExtraccion;
                    double elementoZeroTemp = planeta.elementoZero / tiempoExtraccion;


                    inPlaneta = true;
                    int contador = 0;
                    nombrePlanetaTemp = planeta.nombre;

                    ///Extraer materiales
                    while (contador < tiempoExtraccion)
                    {
                        if (escapar)
                        {
                            escapar = false;
                            break;
                        }

                        contador++;
                        iridio       += (float)iridioTemp;
                        paladio      += (float)paladioTemp;
                        platino      += (float)platinoTemp;
                        elementoZero += (float)elementoZeroTemp;

                        planeta.iridio       -= iridioTemp;
                        planeta.paladio      -= paladioTemp;
                        planeta.platino      -= platinoTemp;
                        planeta.elementoZero -= elementoZeroTemp;

                        iridioPlanetaTemp       = (float)planeta.iridio;
                        paladioPlanetaTemp      = (float)planeta.paladio;
                        platinoPlanetaTemp      = (float)planeta.platino;
                        elementoZeroPlanetaTemp = (float)planeta.elementoZero;

                        iridioPlanetaTemp       = Mathf.Clamp(iridioPlanetaTemp, 0, Mathf.Infinity);
                        platinoPlanetaTemp      = Mathf.Clamp(platinoPlanetaTemp, 0, Mathf.Infinity);
                        paladioPlanetaTemp      = Mathf.Clamp(paladioPlanetaTemp, 0, Mathf.Infinity);
                        elementoZeroPlanetaTemp = Mathf.Clamp(elementoZeroPlanetaTemp, 0, Mathf.Infinity);

                        yield return(new WaitForSeconds(1f));
                    }
                }

                inPlaneta             = false;
                transform.position   -= posiciont;
                transform.eulerAngles = Vector3.zero;
                transform.localScale += escala;


                Vector3 Posfinal = Camera.main.transform.position + offsetExtraccion;

                while ((Posfinal - Camera.main.transform.position).magnitude != 0)
                {
                    Camera.main.transform.position = Vector3.MoveTowards(Camera.main.transform.position, Posfinal, 1f);
                    yield return(null);
                }
                #endregion EntrarAPlaneta
            }
        }

        GameObject.FindGameObjectWithTag("Teletransportar").GetComponent <Teletransportar>().iniciarAnimacion();
        yield return(new WaitForSeconds(2.1f));

        LevelLoader levelLoader = GameObject.FindGameObjectWithTag("LevelLoader").GetComponent <LevelLoader>();
        levelLoader.loadLevel("ViaLactea");
    }