コード例 #1
0
 public void AnyadirPuntoRuta(PuntoRecorrido nuevo)
 {
     if (ruta == null)
     {
         ruta    = new PuntoRecorrido[1];
         ruta[0] = nuevo;
     }
     else
     {
         if (ruta[ruta.Length - 1] != nuevo)
         {
             PuntoRecorrido[] aux = new PuntoRecorrido[ruta.Length + 1];
             for (int i = 0; i < ruta.Length; i++)
             {
                 aux[i] = ruta[i];
             }
             aux[ruta.Length] = nuevo;
             ruta             = new PuntoRecorrido[aux.Length];
             for (int i = 0; i < ruta.Length; i++)
             {
                 ruta[i] = aux[i];
             }
         }
     }
 }
コード例 #2
0
 public Nodo(Nodo _padre, PuntoRecorrido _este, Nodo _hijo, float _g, float _f)
 {
     padre = _padre;
     este  = _este;
     hijo  = _hijo;
     g     = _g;
     f     = _f;
 }
コード例 #3
0
    int IndicePuntoRuta(PuntoRecorrido punto)
    {
        int i = 0;

        while (i < ruta.Length && punto != ruta[i])
        {
            i++;
        }
        return(i);
    }
コード例 #4
0
    void OnTriggerStay2D(Collider2D other)
    {
        if (other.gameObject.tag == "Path")
        {
            if (monstruo.EstadoMonstruoActual() != EstadosMonstruo.EnRuta)
            {
                PuntoRecorrido punto = other.GetComponent <PuntoRecorrido>();

                puntoRutaActual = IndicePuntoRuta(punto);
            }
        }
    }
コード例 #5
0
    //Metodo que pone como posiciones conectadas a aquellas con las que se puede unir el punto en linea recta sin que choque contra ningun obstáculo.
    public void ReiniciarContactos()
    {
        gameObject.GetComponent <Collider2D>().enabled = false;
        int j = puntosDentro;

        PuntoRecorrido[] aux = new PuntoRecorrido[4];
        for (int i = 0; i < puntosDentro; i++)
        {
            aux[i] = posiblesPosicionesConectadas[i];
            posiblesPosicionesConectadas[i].GetComponent <Collider2D>().enabled = false;
        }

        PuntoRecorrido aux1;

        for (int i = 0; i < 4; i++)
        {
            if (!Vector2.Equals(cuatroPosiciones[i], Vector2.negativeInfinity))
            {
                RaycastHit2D[] hit = new RaycastHit2D[2] {
                    Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 1) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona),
                    Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 3) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona)
                };
                if (hit[0].collider != null && hit[1].collider != null &&
                    (aux[j] = hit[0].collider.gameObject.GetComponent <PuntoRecorrido>()) != null &&
                    (aux1 = hit[1].collider.gameObject.GetComponent <PuntoRecorrido>()) != null)
                {
                    if (!(Mathf.Approximately(posiblesPosicionesConectadas[j].transform.position.x - transform.position.x, 0f) ||
                          Mathf.Approximately(posiblesPosicionesConectadas[j].transform.position.y - transform.position.y, 0f)))
                    {
                        aux[j] = aux1;
                    }
                    j++;
                }
            }
        }

        //Actualizamos las posiciones conectadas
        posicionesConectadas = new PuntoRecorrido[j];
        for (int i = 0; i < j; i++)
        {
            posicionesConectadas[i] = aux[i];
        }
        //Volvemos a activar su collider.
        gameObject.GetComponent <Collider2D>().enabled = true;
        for (int i = 0; i < j; i++)
        {
            posiblesPosicionesConectadas[i].GetComponent <Collider2D>().enabled = true;
        }
    }
コード例 #6
0
    PuntoRecorrido AjustarseAPuntoRecorrido(Vector3 punto, PuntoRecorrido[] pR)
    {
        float distancia = float.PositiveInfinity;

        PuntoRecorrido v = null;

        for (int i = 0; i < pR.Length; i++)
        {
            float aux = (punto - pR[i].transform.position).sqrMagnitude;
            if (aux < distancia)
            {
                distancia = aux;
                v         = pR[i];
            }
        }
        return(v);
    }
コード例 #7
0
        //Introduce los nodos en la lista que se encuentren en el punto y los que esten proyectando un raycast en las cuatro direcciones cardinales.
        public void IntroducirNodosEnCruz(Vector2 posicion, PuntoRecorrido[] puntosDistanciaManhattan)
        {
            //funcionVacia LlamadaDesactivar;
            //LlamadaDesactivar = () => { };
            //Comprobamos que el punto no este dentro de uno de los puntos de la red.
            int i = 0;

            while (i < puntosTotales.Length && !puntosTotales[i].GetComponent <Collider2D>().bounds.Contains(posicion))
            {
                i++;
            }
            if (i != puntosTotales.Length)
            {
                float distancia = puntosTotales[i].DistanciaHasta(posicion);
                IntroducirNodo(new Nodo(null, puntosTotales[i], null, distancia, distancia + ControladorRecorrido.instance.DistanciaMasCorta(posicion, puntosDistanciaManhattan)));
            }
            else
            {
                RaycastHit2D[] hit = new RaycastHit2D[4];
                hit[0] = Physics2D.Raycast(posicion, Vector2.up, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona);
                Debug.DrawRay(posicion, Vector2.up, Color.green, 10f);
                hit[1] = Physics2D.Raycast(posicion, Vector2.right, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona);
                Debug.DrawRay(posicion, Vector2.right, Color.green, 10f);
                hit[2] = Physics2D.Raycast(posicion, Vector2.down, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona);
                Debug.DrawRay(posicion, Vector2.down, Color.green, 10f);
                hit[3] = Physics2D.Raycast(posicion, Vector2.left, Mathf.Infinity, ControladorRecorrido.instance.conQueColisiona);
                Debug.DrawRay(posicion, Vector2.left, Color.green, 10f);
                PuntoRecorrido aux = null;
                for (int j = 0; j < 4; j++)
                {
                    if (hit[j].collider != null && (aux = hit[j].collider.GetComponent <PuntoRecorrido>()) != null)
                    {
                        float distancia = aux.DistanciaHasta(posicion);
                        IntroducirNodo(new Nodo(null, aux, null, distancia, distancia + ControladorRecorrido.instance.DistanciaMasCorta(posicion, puntosDistanciaManhattan)));
                    }
                }
            }
        }
コード例 #8
0
 public void QuitarUltimoPuntoRuta()
 {
     if (ruta != null)
     {
         if (ruta.Length == 1)
         {
             ruta = null;
         }
         else
         {
             PuntoRecorrido[] aux = new PuntoRecorrido[ruta.Length - 1];
             for (int i = 0; i < aux.Length; i++)
             {
                 aux[i] = ruta[i];
             }
             ruta = new PuntoRecorrido[aux.Length];
             for (int i = 0; i < ruta.Length; i++)
             {
                 ruta[i] = aux[i];
             }
         }
     }
 }
コード例 #9
0
    private void OnSceneGUI()
    {
        PoligonoRecorrido recorrido = target as PoligonoRecorrido;
        DetectarRuta      detector  = recorrido.GetComponent <DetectarRuta>();

        recorrido.transform.position = (Vector2)recorrido.transform.position;
        Transform  agarraderaTransform  = recorrido.transform;
        Quaternion agarraderaDeRotacion = Tools.pivotRotation == PivotRotation.Local ? agarraderaTransform.rotation : Quaternion.identity;

        Vector2[] puntos = new Vector2[recorrido.numeroDePuntos];
        if (recorrido.Puntos() == null || recorrido.numeroDePuntos != recorrido.Puntos().Length)
        {
            recorrido.CrearPuntos(recorrido.numeroDePuntos);
        }
        for (int i = 0; i < recorrido.numeroDePuntos; i++)
        {
            Undo.RecordObject(target, "Move Point");
            EditorUtility.SetDirty(target);
            puntos[i] = recorrido.Puntos()[i];
        }


        PuntoRecorrido[] puntosRecorrido  = GameObject.FindObjectsOfType <PuntoRecorrido>();
        PuntoRecorrido[] puntosAuxiliares = new PuntoRecorrido[puntosRecorrido.Length];
        int j = 0;

        for (int i = 0; i < puntos.Length; i++)
        {
            Handles.color = Color.white;
            Handles.DrawLine(puntos[i], puntos[(i + 1) % puntos.Length]);
            Vector2 distancia = puntos[(i + 1) % puntos.Length] - puntos[i];
            Handles.ArrowHandleCap(0, puntos[i],
                                   Quaternion.LookRotation(distancia),
                                   3,
                                   EventType.Repaint);

            string aux = "<color=red>" + i + "</color>";
            Handles.Label(puntos[i], aux, estilo);
            EditorGUI.BeginChangeCheck();
            puntos[i] = Handles.FreeMoveHandle(i, puntos[i], agarraderaDeRotacion, 0.5f, Vector3.one * 0.1f, DibujarAgarraderaPunto);
            if (EditorGUI.EndChangeCheck())
            {
                Undo.RecordObject(detector, "Move Point");
                EditorUtility.SetDirty(detector);
                recorrido.Puntos()[i] = puntos[i];
            }
            else
            {
                Undo.RecordObject(detector, "Move Point");
                EditorUtility.SetDirty(detector);
                puntosAuxiliares[j]   = AjustarseAPuntoRecorrido(puntos[i], puntosRecorrido);
                recorrido.Puntos()[i] = puntosAuxiliares[j].transform.position;
                j++;
                DibujarAgarraderaPunto(i, puntos[i], agarraderaDeRotacion, 0.5f, EventType.Repaint);
            }
        }

        PuntoRecorrido[] puntosFinales = new PuntoRecorrido[j];
        for (int i = 0; i < j; i++)
        {
            puntosFinales[i] = puntosAuxiliares[i];
        }

        detector.CrearPuntosRuta(puntosFinales);
    }
コード例 #10
0
 private void OnEnable()
 {
     todosLosPuntos = GameObject.FindObjectOfType <PuntoRecorrido>();
 }
コード例 #11
0
    public void CrearPrimerosContactos()
    {
        conQueColisiona = LayerMask.GetMask("Obstaculos", "Recorrido");
        //Desactiva su collider para que el rayo a proyectar no interfiera.
        unCuarto = GetComponent <Collider2D>().bounds.size.x / 8f;
        gameObject.GetComponent <Collider2D>().enabled = false;
        //Busca todos los puntos del mapa.
        PuntoRecorrido[] puntosMapa = GameObject.FindObjectsOfType <PuntoRecorrido>();

        //Creamos un vector auxiliar que guardara los puntos en contacto
        PuntoRecorrido[] aux = new PuntoRecorrido[puntosMapa.Length];
        int j = 0;

        PuntoRecorrido[] puntosTotales = GameObject.FindObjectsOfType <PuntoRecorrido>();

        //

        cuatroPosiciones = new Vector2[4];
        cuatroCardinales = new Vector2[4];
        for (int i = 0; i < 4; i++)
        {
            cuatroPosiciones[i] = new Vector2(SucesionZeroUnoZeroMenosUno(i), SucesionZeroUnoZeroMenosUno(i + 1)) * unCuarto;
            cuatroCardinales[i] = cuatroPosiciones[i];
        }

        //Comprobamos que el punto no este dentro de uno de los puntos de la red.
        for (int i = 0; i < puntosTotales.Length; i++)
        {
            if (puntosTotales[i].GetComponent <Collider2D>().bounds.Contains(transform.position) && puntosTotales[i] != this)
            {
                aux[j] = puntosTotales[i];
                aux[j].GetComponent <Collider2D>().enabled = false;
                j++;
                puntosDentro++;
            }
        }

        for (int i = 0; i < j; i++)
        {
            Vector2 esaPosicion = aux[i].transform.position;
            if (esaPosicion.y - transform.position.y < 0f)
            {
                cuatroPosiciones[2] = Vector2.negativeInfinity;
            }
            else if (esaPosicion.x - transform.position.x < 0f)
            {
                cuatroPosiciones[3] = Vector2.negativeInfinity;
            }
            else if (esaPosicion.y - transform.position.y > 0f)
            {
                cuatroPosiciones[0] = Vector2.negativeInfinity;
            }
            else if (esaPosicion.x - transform.position.x > 0f)
            {
                cuatroPosiciones[1] = Vector2.negativeInfinity;
            }
        }

        PuntoRecorrido aux1;

        for (int i = 0; i < 4; i++)
        {
            if (!Vector2.Equals(cuatroPosiciones[i], Vector2.negativeInfinity))
            {
                RaycastHit2D[] hit = new RaycastHit2D[2] {
                    Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 1) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona),
                    Physics2D.Raycast((Vector2)transform.position + cuatroCardinales[(i + 3) % 4], cuatroCardinales[i], Mathf.Infinity, conQueColisiona)
                };
                if (hit[0].collider != null && hit[1].collider != null &&
                    (aux[j] = hit[0].collider.gameObject.GetComponent <PuntoRecorrido>()) != null &&
                    (aux1 = hit[1].collider.gameObject.GetComponent <PuntoRecorrido>()) != null)
                {
                    if (!(Mathf.Approximately(aux[j].transform.position.x - transform.position.x, 0f) || Mathf.Approximately(aux[j].transform.position.y - transform.position.y, 0f)))
                    {
                        aux[j] = aux1;
                    }
                    j++;
                }
                else
                {
                    cuatroPosiciones[i] = Vector2.negativeInfinity;
                }
            }
        }

        //Actualizamos las posiciones conectadas
        posiblesPosicionesConectadas = new PuntoRecorrido[j];
        for (int i = 0; i < j; i++)
        {
            posiblesPosicionesConectadas[i] = aux[i];
        }
        //Volvemos a activar su collider.
        gameObject.GetComponent <Collider2D>().enabled = true;
        for (int i = 0; i < j; i++)
        {
            posiblesPosicionesConectadas[i].GetComponent <Collider2D>().enabled = true;
        }
    }
コード例 #12
0
 public float DistanciaHasta(PuntoRecorrido objetivo)
 {
     return(((Vector2)(transform.position - objetivo.transform.position)).sqrMagnitude);
 }