Rodents - GameVerse Studio

Programación Orientada a Objetos (Tower defense - kingdom rush)

Moderator: julianmartinez16

User avatar
Dacas
Posts: 33
Joined: Thu Jul 18, 2019 9:29 am

Re: Rodents - GameVerse Studio

Post by Dacas » Wed Feb 26, 2020 10:31 pm

¿Que hemos hecho?
  • Sufrir
  • Código de las balas
  • Nuevo código de la torre
  • Buscar el asset de la bala
  • Corregir errores
¿Que vamos a hacer?
  • Barra de vida del enemigo
  • Ver vídeos
Dificultades
  • La versión de unity nos ha dado fallos
  • No sabíamos como corregir un error en el cual la unidad no se movía

Bala

Image

Disparo de la bala



Código de la bala

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bala : MonoBehaviour
{
    private GameObject objetivo;
    private float velocidad = 2;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 direccion;
        if (objetivo != null)
        {
            direccion = objetivo.transform.position - this.transform.position;
            this.transform.position += velocidad * direccion * Time.deltaTime;

        }
            
        
        
    }

    public void ActivarBala(Torre torre)
    {
        objetivo = torre.Enemigo;
    }
}
Nuevo código de la torre

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Torre : MonoBehaviour
{
    
    
    private GameObject enemigo;
    private bool esta_activa;
    private float distancia_umbral = 2f;

    

    void Start()
    {


    }

   
    void Update()
    {
        Enemigo = BuscarEnemigoCercano();
        if(Enemigo !=null)
        {
            Disparar();
            Debug.DrawLine(this.transform.position, enemigo.transform.position, Color.yellow);
        }
    }

    void Disparar()
    {
        GameObject obj = (GameObject)Instantiate(GameObject.Find("Spray"), this.transform.position, Quaternion.identity);
        Bala bala = obj.GetComponent<Bala>();
        bala.ActivarBala(this);
    }

    GameObject BuscarEnemigoCercano()
    {
        ArrayList enemigos = PollingUnidades.unidades;
        GameObject temp;
        foreach (Object item in enemigos)
        {
            temp = (GameObject)item;
            if(Vector3.Distance(temp.transform.position, this.transform.position)<distancia_umbral)
            {
                return temp;
            }

        }
        return null;
    }

    public bool Esta_activa { get => esta_activa; set => esta_activa = value; }
    public GameObject Enemigo { get => enemigo; set => enemigo = value; }
}
    
Diego Castillo.
PDOO.

User avatar
EstebanaOrozco
Posts: 9
Joined: Fri Jan 24, 2020 2:44 pm

Re: Rodents - GameVerse Studio

Post by EstebanaOrozco » Sat Feb 29, 2020 10:06 pm

¿Que hemos hecho?
  • Hacer barras de vida
  • Programar barras de vida
    Corregir errores
¿Que vamos a hacer?
  • Animación enemigos
  • Ver vídeos
Dificultades
  • El tiled2unity nos dio fallos
  • El enemigo se volvió loco y no se movía
Barras de vida

Image

Image

Vídeo implementación barras de vida



Código barra de vida

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LogicaBarra : MonoBehaviour
{
    public GameObject rata;
    public GameObject barra_verde;
    public GameObject barra_roja;
    float escala = .001f;
    SpriteRenderer sr;



    // Start is called before the first frame update
    void Start()
    {
        sr = barra_verde.GetComponent<SpriteRenderer>();
        
    }

    // Update is called once per frame
    void Update()
    {
        if (sr.transform.localScale.x > 0)
        {
            sr.transform.localScale -= new Vector3(escala,0);
            barra_verde.transform.position = rata.transform.position - new Vector3(.21f-sr.bounds.size.x/6,-.4f);
            barra_roja.transform.position = rata.transform.position - new Vector3(-.03f, -.4f);
        }
        
    }
}
Estebana Orozco R.
Estudiante de programación orientada a objetos 2020-1 :?:

User avatar
Dacas
Posts: 33
Joined: Thu Jul 18, 2019 9:29 am

Re: Rodents - GameVerse Studio

Post by Dacas » Tue Mar 03, 2020 9:37 pm

¿Que hemos hecho?
  • Crear las animaciones en unity
  • Modificar el codigo de la unidad
  • Código de dirección
¿Que vamos a hacer?
  • Solucionar errores
  • Vidas de las unidades
Dificultades
  • El personaje no realiza la animación y no hemos encontrado el porque
Animador

Image

Puntos de ruta con su respectivo cambio de dirección

Image

Animación



Movimiento no funciona



Código nuevo de la unidad

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Unidad_1 : MonoBehaviour
{
    
     public GameObject ruta;
    private int indice;
    private Vector2 posicion_inicial;
    private Transform posicion_siguiente;
    private Transform posicion_actual;
    private float vel ;
    private float distancia_punto ;
   private bool esta_viva;
    private float tiempo;
    private int vidas;
    private Vector3 posicion_muerte;
    private Animator controlador;

    

    private void Start()
    {
        vel = 1f;
        vidas = 3;
        distancia_punto = .1f;
        esta_viva = true;
        posicion_inicial = this.transform.position;
        posicion_siguiente = ruta.transform.GetChild(0);
        controlador = this.GetComponent<Animator>();

    }

    void Update()
    {

       
        if (esta_viva)
        {
            //dir = posicion_siguiente - this.transform.position;
            // dir.z = 0;
            this.transform.position = Vector2.MoveTowards(transform.position, posicion_siguiente.position, vel * Time.deltaTime);

            if (Vector2.Distance(transform.position, posicion_siguiente.position) < distancia_punto)
            {
                if (indice + 1 < ruta.transform.childCount)
                {
                    indice++;
                    posicion_actual = posicion_siguiente;
                    posicion_siguiente = ruta.transform.GetChild(indice);
                    CambiarPosicion();
                }
                else
                {
                    indice = 0;
                    transform.position = posicion_inicial;
                    posicion_siguiente = ruta.transform.GetChild(0);
                    posicion_actual = null;
                }

            }
        }
    }


        private void CambiarPosicion()

        {
            int direccion = 1;
            Direccion mira_hacia;

            if (posicion_actual != null)
            {
                mira_hacia = posicion_actual.GetComponent<Direccion>();
                if (mira_hacia.Ubicacion == Direccion.ARRIBA)
                {
                    direccion = Direccion.ARRIBA;
                }
                if (mira_hacia.Ubicacion == Direccion.ABAJO)
                {
                    direccion = Direccion.ABAJO;
                }
                if (mira_hacia.Ubicacion == Direccion.IZQUIERDA)
                {
                    direccion = Direccion.IZQUIERDA;
                }
                if (mira_hacia.Ubicacion == Direccion.DERECHA)
                {
                    direccion = Direccion.DERECHA;
                }
                controlador.SetInteger("direccion", direccion);
            }

        }
    void OnTriggerEnter2D(Collider2D otro)
    {
        if (otro.gameObject.tag == "bala")
        {
            Destroy(otro.gameObject);
        }
    }



     public bool Esta_viva
    {
        get => esta_viva; set => esta_viva = value;
    }


}



Código dirección

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Direccion : MonoBehaviour
{
    public int ubicacion;

    public const int ARRIBA = 1;
    public const int DERECHA = 2;
    public const int ABAJO = 3;
    public const int IZQUIERDA = 4 ;

    public int Ubicacion { get => ubicacion; set => ubicacion = value; }
}
Diagrama de clases

Image

Image
Diego Castillo.
PDOO.

User avatar
xacarana
Site Admin
Posts: 1248
Joined: Fri Jan 15, 2016 6:13 pm

Re: Rodents - GameVerse Studio

Post by xacarana » Fri Mar 06, 2020 3:03 pm

Image

Muy bien con el cumplimiento, sin embargo poner atención a:
  • El diagrama de clases se debe ver mejor
  • ¿Qué pasa con los problemas de funcionamiento? Pueden ir en horario de atención extra a al clase, lleven el proyecto en sus equipos.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
EstebanaOrozco
Posts: 9
Joined: Fri Jan 24, 2020 2:44 pm

Re: Rodents - GameVerse Studio

Post by EstebanaOrozco » Fri Mar 06, 2020 10:17 pm

¿Que hemos hecho?
  • Solucionamos el error del movimiento
  • se corrigió el código de dirección
¿Que vamos a hacer?
  • Ver vídeos
  • Corregir problema de tiled2unity
  • Vida de enemigos y refactorización
Dificultades
  • El tiled2unity nos presenta un error.
Vídeo del movimiento corregido



Código dirección corregido

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Direccion : MonoBehaviour
{
    [SerializeField]
    private int ubicacion;

    public const int ARRIBA = 1;
    public const int DERECHA = 2;
    public const int ABAJO = 3;
    public const int IZQUIERDA = 4 ;

    public int Ubicacion { get => ubicacion; set => ubicacion = value; }
}
Estebana Orozco R.
Estudiante de programación orientada a objetos 2020-1 :?:

User avatar
xacarana
Site Admin
Posts: 1248
Joined: Fri Jan 15, 2016 6:13 pm

Re: Rodents - GameVerse Studio

Post by xacarana » Wed Mar 11, 2020 2:31 pm

Image

¡Muy bien! Cuando ajusten el pooling de balas, van a mejorar el efecto panal persiguiendo a los enemigos ;)
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
Dacas
Posts: 33
Joined: Thu Jul 18, 2019 9:29 am

Re: Rodents - GameVerse Studio

Post by Dacas » Thu Mar 12, 2020 9:29 am

¿Que hemos hecho?
  • optimizar código
  • corregir errores anteriores
  • Agregarle el daño al enemigo
¿Que vamos a hacer?
  • Intentar arreglar el nuevo error
  • Adelantar HUD
Dificultades
  • La barra del enemigo no se ve en el modo juego
  • Los enemigos cuando vuelven al punto inicial, lo hacen con la vida que tenían.
Vídeo enemigos disminuyendo la vida y errores



Nuevo código torre

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Torre : MonoBehaviour
{
    
    
    private GameObject enemigo;
    private bool esta_activa;
    private float distancia_umbral;
    private float tiempo_disparo;
    private GameObject[] balas;

    

    void Start()
    {
        distancia_umbral = 2f;
        tiempo_disparo = .8f;
        crearBalas(5);

    }

   
    void Update()
    {
        Enemigo = BuscarEnemigoCercano();
        if (Enemigo != null && tiempo_disparo <= 0)
        {
            Disparar();
            Debug.DrawLine(this.transform.position, enemigo.transform.position, Color.yellow);
            tiempo_disparo = 1f;
        }
        else
        {
            tiempo_disparo -= Time.deltaTime;
        }
    }

    private void crearBalas(int total_balas)
    {
        balas = new GameObject[total_balas];
        for (int i = 0; i < balas.Length; i++)
        {
            balas[i] = Instantiate(GameObject.Find("Spray"), this.transform.position, Quaternion.identity);
        }
    }

    private Bala DespacharBalaLibre()
    {
        Bala libre = null;

        for (int i = 0; i < balas.Length; i++)
        {
            libre = balas[i].GetComponent<Bala>();

            if (!libre.Disparada)
            {
                break;
            }
        }
        return libre;
    }



    void Disparar()
    {
        Bala bala = DespacharBalaLibre();
        bala.ActivarBala(this);
    }

    GameObject BuscarEnemigoCercano()
    {
        ArrayList enemigos = PollingUnidades.unidades;
        GameObject temp;
        foreach (Object item in enemigos)
        {
            temp = (GameObject)item;
            if(Vector3.Distance(temp.transform.position, this.transform.position)<distancia_umbral)
            {
                return temp;
            }

        }
        return null;
    }

    public bool Esta_activa { get => esta_activa; set => esta_activa = value; }
    public GameObject Enemigo { get => enemigo; set => enemigo = value; }
}
Nuevo código unidad

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Unidad_1 : MonoBehaviour
{
    [SerializeField]
     public GameObject ruta;
    private int indice;
    private Vector2 posicion_inicial;
    private Transform posicion_siguiente;
    private Transform posicion_actual;
    [SerializeField]
    private float vel ;
    private float distancia_punto ;
   private bool esta_viva;
    private float tiempo;
    [SerializeField]
    private int vidas;
    private float delta_vida;
    private Vector3 posicion_muerte;
    private Animator controlador;
    private LogicaBarra lb;

    

    private void Start()
    {
        vel = 1f;
        delta_vida = 1f / vidas;
        //vidas = 3;
        distancia_punto = .1f;
        esta_viva = true;
        posicion_inicial = this.transform.position;
        posicion_siguiente = ruta.transform.GetChild(0);
        controlador = this.GetComponent<Animator>();
        lb = this.GetComponent<LogicaBarra>();

    }

    void Update()
    {

       
        if (esta_viva)
        {
            //dir = posicion_siguiente - this.transform.position;
            // dir.z = 0;
            this.transform.position = Vector2.MoveTowards(transform.position, posicion_siguiente.position, vel * Time.deltaTime);

            if (Vector2.Distance(transform.position, posicion_siguiente.position) < distancia_punto)
            {
                if (indice + 1 < ruta.transform.childCount)
                {
                    indice++;
                    posicion_actual = posicion_siguiente;
                    posicion_siguiente = ruta.transform.GetChild(indice);
                    CambiarPosicion();
                }
                else
                {
                    indice = 0;
                    transform.position = posicion_inicial;
                    posicion_siguiente = ruta.transform.GetChild(0);
                    posicion_actual = null;
                }

            }
        }
        else
        {
            Posicion_muerte = this.transform.position;
            this.transform.position = posicion_inicial;
        }
    }


        private void CambiarPosicion()

        {
            int direccion = 1;
            Direccion mira_hacia;

            if (posicion_actual != null)
            {
                mira_hacia = posicion_actual.GetComponent<Direccion>();
                if (mira_hacia.Ubicacion == Direccion.ARRIBA)
                {
                    direccion = Direccion.ARRIBA;
                }
                if (mira_hacia.Ubicacion == Direccion.ABAJO)
                {
                    direccion = Direccion.ABAJO;
                }
                if (mira_hacia.Ubicacion == Direccion.IZQUIERDA)
                {
                    direccion = Direccion.IZQUIERDA;
                }
                if (mira_hacia.Ubicacion == Direccion.DERECHA)
                {
                    direccion = Direccion.DERECHA;
                }
                controlador.SetInteger("direccion", direccion);
            }

        }
    void OnTriggerEnter2D(Collider2D otro)
    {
        Bala bala;

        if (vidas > 0)
        {
            if (otro.gameObject.tag == "bala")
            {
                bala = otro.gameObject.GetComponent<Bala>();
                bala.Disparada = false;

                if (--vidas == 0)
                {
                    esta_viva = false;
                    Debug.Log("Se murio la unidad");
                }
                else
                {
                    lb.ModificarBarra(delta_vida);
                }
            }
        }

        
    }



     public bool Esta_viva
    {
        get => esta_viva; set => esta_viva = value;
    }
    public Vector3 Posicion_muerte { get => posicion_muerte; set => posicion_muerte = value; }
}
Diego Castillo.
PDOO.

User avatar
EstebanaOrozco
Posts: 9
Joined: Fri Jan 24, 2020 2:44 pm

Re: Rodents - GameVerse Studio

Post by EstebanaOrozco » Fri Mar 13, 2020 3:48 pm

¿Que hemos hecho?
  • Adelantamos interfaz gráfica
  • Código Hud
  • Intentar corregir errores
¿Que vamos a hacer?
  • Corregir barra de vida
  • Solucionar problemas Hud


Dificultades
  • La barra del enemigo no se ve en el modo juego
  • Código Hud, no se reconoce como clase
HUD en el juego

Image

Intento de utilizar la clase Hud en el script de la unidad. Error no se reconoce como clase

Image

Moneda

Image

Codigo del HUD hasta ahora

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Hud : MonoBehaviour{

    [SerializeField]
    private Text monedas;
    private static int contador_monedas;
    public static void ActualizarMoneda(int valor)
    {
        contador_monedas += valor;
    }

    // Update is called once per frame
    void Update()
    {
        monedas.text = contador_monedas.ToString();
    }
}
Estebana Orozco R.
Estudiante de programación orientada a objetos 2020-1 :?:

User avatar
Dacas
Posts: 33
Joined: Thu Jul 18, 2019 9:29 am

Re: Rodents - GameVerse Studio

Post by Dacas » Wed Mar 18, 2020 11:03 am

¿Que hemos hecho?
  • Solucionamos error del hud
  • Corregimos sript unidad
¿Que vamos a hacer?
  • Intentar solucionar error pendiente de barras de vida
  • Sistema de comprar torres
Dificultades
  • Error pendiente de barras de vida

Moneda para el HUD

Image

Como se ve el HUD

Image

Vídeo con el error solucionado



Código unidad

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Unidad_1 : MonoBehaviour
{


    [SerializeField]
    public GameObject ruta;
    private int indice;
    private Vector2 posicion_inicial;
    private Transform posicion_siguiente;
    private Transform posicion_actual;
    [SerializeField]
    private float vel;
    private float distancia_punto;
    private bool esta_viva;
    private float tiempo;
    [SerializeField]
    private int vidas;
    [SerializeField]
    private int valor_muerte;
    private float delta_vida;
    private Vector3 posicion_muerte;
    private Animator controlador;
    private LogicaBarra lb;



    private void Start()
    {
        vel = 1f;
        delta_vida = 1f / vidas;
        //vidas = 3;
        distancia_punto = .1f;
        esta_viva = true;
        posicion_inicial = this.transform.position;
        posicion_siguiente = ruta.transform.GetChild(0);
        controlador = this.GetComponent<Animator>();
        lb = this.GetComponent<LogicaBarra>();

    }

    void Update()
    {


        if (esta_viva)
        {
            //dir = posicion_siguiente - this.transform.position;
            // dir.z = 0;
            this.transform.position = Vector2.MoveTowards(transform.position, posicion_siguiente.position, vel * Time.deltaTime);

            if (Vector2.Distance(transform.position, posicion_siguiente.position) < distancia_punto)
            {
                if (indice + 1 < ruta.transform.childCount)
                {
                    indice++;
                    posicion_actual = posicion_siguiente;
                    posicion_siguiente = ruta.transform.GetChild(indice);
                    CambiarPosicion();
                }
                else
                {
                    indice = 0;
                    transform.position = posicion_inicial;
                    posicion_siguiente = ruta.transform.GetChild(0);
                    posicion_actual = null;
                }

            }
        }
        else
        {
            Posicion_muerte = this.transform.position;
            this.transform.position = posicion_inicial;
        }
    }


    private void CambiarPosicion()

    {
        int direccion = 1;
        Direccion mira_hacia;

        if (posicion_actual != null)
        {
            mira_hacia = posicion_actual.GetComponent<Direccion>();
            if (mira_hacia.Ubicacion == Direccion.ARRIBA)
            {
                direccion = Direccion.ARRIBA;
            }
            if (mira_hacia.Ubicacion == Direccion.ABAJO)
            {
                direccion = Direccion.ABAJO;
            }
            if (mira_hacia.Ubicacion == Direccion.IZQUIERDA)
            {
                direccion = Direccion.IZQUIERDA;
            }
            if (mira_hacia.Ubicacion == Direccion.DERECHA)
            {
                direccion = Direccion.DERECHA;
            }
            controlador.SetInteger("direccion", direccion);
        }

    }
    void OnTriggerEnter2D(Collider2D otro)
    {
        Bala bala;

        if (vidas > 0)
        {
            if (otro.gameObject.tag == "bala")
            {
                bala = otro.gameObject.GetComponent<Bala>();
                bala.Disparada = false;

                if (--vidas == 0)
                {
                    esta_viva = false;
                    Hud.ActualizarMoneda(valor_muerte);
                    
                }
                else
                {
                    lb.ModificarBarra(delta_vida);
                }
            }
        }


    }



    public bool Esta_viva
    {
        get => esta_viva; set => esta_viva = value;
    }
    public Vector3 Posicion_muerte { get => posicion_muerte; set => posicion_muerte = value; }
}



Diego Castillo.
PDOO.

User avatar
EstebanaOrozco
Posts: 9
Joined: Fri Jan 24, 2020 2:44 pm

Re: Rodents - GameVerse Studio

Post by EstebanaOrozco » Fri Mar 20, 2020 10:09 pm

¿Que hemos hecho?
  • Sufrir.
  • Ver el vídeo 11.
  • Crear la segunda versión de la torre.
  • Animación de las torres.
  • Script de ControlTorres.
¿Que vamos a hacer?
Necesitamos una asesoría para:
  • Solucionar error pendiente de barras de vida, porque no hemos encontrado la falla.
  • Corregir error en los botones de la torre, pues no aparecen en el modo juego.
Dificultades
Por circunstancias de tiempo y espacios no hemos podido agendar una asesoría para corregir los errores.

Evidencias

Image
Torre con los botones.
Image
Icono para el botón 1.
Image
Icono para el botón 2.
Image
Versión 2 de la torre.
Estebana Orozco R.
Estudiante de programación orientada a objetos 2020-1 :?:

Post Reply