Tower Defense - Walls Games

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

Moderator: julianmartinez16

User avatar
kr29
Posts: 5
Joined: Fri Jan 24, 2020 2:21 pm

Re: Tower Defense - Walls Games

Post by kr29 » Thu Mar 19, 2020 5:33 pm

¿Que hemos hecho?
programación de la barra de vidas y estamos arreglando la dirección de movimiento que se subira la proxima clase

Code: Select all

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

public class logicabarra : MonoBehaviour { 
 
    public Gameobject enemigo;
    public Gameobjec 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.tansform.position = enemigo.transform.position - new vector3(.3f-sr.bounds.size.x/2,-.4f);
            barra_roja.transform.position = enemigo.transform.position - new vector3(.05f, -.4f);

        }
        
    }
}
el codigo esta bien pero cuando voy agregar la logica a la barra me aparece que no se puede agregar el componente de secuencia de comandos porque no se encuentra la clase de secuencia y el codigo se encuantra en el unity

¿que falta por hacer?
terminar de cuadrar el direccionamiento de enemigos y la refactorizacion

¿que dificultades hemos tenido?
el visual no tiene en cuenta el gameobject, por esta razón, pedi asesoria y lo otro es cuando voy agregar la logica a la barra.

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Fri Mar 20, 2020 9:40 pm

¿Qué hemos hecho?
  • Se actualizó el código de la torre (Daniela)

Code: Select all

public class Torre : MonoBehaviour
{
    [SerializeField]
    private GameObject proyectil;
    private GameObject enemigo;
    private bool esta_activa;
    [SerializeField]
    private float distancia_umbral = 10f;
    [SerializeField]
    private float retraso_disparo;
    private float enfriamiento;
    [SerializeField]
    private int rafaga;
    [SerializeField]
    private int disparos_restantes;
    [SerializeField]
    private float retraso_rafaga;
    [SerializeField]
    private float enfriamiento_rafaga;
    
    void Start()
    {
        disparos_restantes = rafaga;
        enfriamiento = 0;
        enfriamiento_rafaga = 0;
    }

    void Update()
    {
        if (enfriamiento > 0) {enfriamiento -= Time.deltaTime;}
        if (enfriamiento_rafaga > 0) { enfriamiento_rafaga -= Time.deltaTime; }
        Enemigo = BuscarEnemigoCercano();
        if (Enemigo != null)
        {
            Disparar();
            Debug.DrawLine(this.transform.position, Enemigo.transform.position, Color.yellow);
        }
    }

    void Disparar()
    {
        if (enfriamiento <= 0)
        {
            if (disparos_restantes > 0)
            {
                if (enfriamiento_rafaga <= 0)
                {
                    audio.clip = disparo; audio.Play();
                    GameObject obj = (GameObject)Instantiate(proyectil, this.transform.position, Quaternion.identity);
                    Bala bala = obj.GetComponent<Bala>();
                    bala.ActivarBala(this);
                    enfriamiento_rafaga = retraso_rafaga;
                    disparos_restantes -= 1;
                }
            }
            else { enfriamiento = retraso_disparo; disparos_restantes = rafaga; }
        }
    }

    GameObject BuscarEnemigoCercano()
    {
        GameObject[] enemigos = GameObject.FindGameObjectsWithTag("Enemigo");
        GameObject temp;
        foreach (object item in enemigos)
        {
            temp = (GameObject)item;
            if(temp.GetComponent<Salud>().esta_Muerto != true)
            {
                if (Vector3.Distance(temp.transform.position, this.transform.position) < distancia_umbral)
                {
                    return temp;
                }
            }
        }
        return null;
    }

    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, distancia_umbral);
    }

    public GameObject Enemigo
    {
        get => enemigo; set => enemigo = value;
    }
    public bool Esta_activa
    {
        get => esta_activa; set => esta_activa = value;
    }
}
  • Se empezó a programar la animación de los enemigos.(Daniela)

Code: Select all

public class AnimacionEnemigos : MonoBehaviour
{

    Animator animator;

    // Start is called before the first frame update
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        RevisarDireccion();
    }

    void RevisarDireccion()
    {
        GameObject a = transform.parent.gameObject;
        if (a.GetComponent<Enemigo>().mov_Izquierda == true)
        {
            animator.SetBool("mov_Izquierda", true);
        }
        else { animator.SetBool("mov_Izquierda", false); }
    }
}
¿Qué falta por hacer?
  • La dirección de enemigos.
  • Empezar a preparar presentación y clases para la pre entrega.
¿Qué dificultades hemos tenido?

El código que subió Santiago tiene errores, entonces hay que revisarlo, arreglarlo y continuar programando. En eso se pierde mucho tiempo.
Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Wed Mar 25, 2020 6:53 pm

¿Qué hemos hecho?
  • Se empezó a implementar el código de salud de enemigos. (Daniela)

Code: Select all

{
    [SerializeField]
    private float salud_Maxima = 20;
    [SerializeField]
    private float salud_Actual = 20; // Establece la salud de la unidad.
    private float retraso_muerte = 5f; // Genera un retraso antes de la desaparicion de la unidad, actualmente sin ser usado, sera reemplazado por la animacion de muerte.
    public bool esta_Muerto = false;
    private float frecuenciaUnidad = 1f;
    private float contador = 1f;
    [SerializeField]
    [SerializeField]
    private bool atacado_por_unidades;
    [SerializeField]
    private Image barra;
    private float saludDisplay;

    void Start()
    {
    }

    void Update()
    {
        if (salud_Actual <= salud_Maxima / 3) { barra.color = new Color32(255, 0, 0, 255); }
        else { barra.color = new Color32(49, 91, 53, 255); }
        if (saludDisplay != salud_Actual)
        {
            if (saludDisplay/3 > salud_Actual)
            {
                saludDisplay -= 0.5f;
            }
            if (saludDisplay*3 < salud_Actual)
            {
                saludDisplay += 0.1f;
            }
            if (saludDisplay > salud_Actual)
            {
                saludDisplay -= 0.1f;
            }
            if (saludDisplay < salud_Actual)
            {
                saludDisplay += 0.1f;
            }
        }

        if (contador > 0) {contador -= Time.deltaTime;}
        if (esta_Muerto == false && salud_Actual <=0) {}
        if (salud_Actual <= 0) {esta_Muerto = true;}
        if (esta_Muerto == true) {retraso_muerte -= Time.deltaTime;}// Activa el contador de muerte, sera empleado por la animacion de muerte.
        if (retraso_muerte <= 0) {Destroy(this.gameObject);}
        barra.fillAmount = saludDisplay/salud_Maxima;
    }

    void OnTriggerEnter(Collider collider)
    {
        if (collider.gameObject.CompareTag("Bala"))
        {
            salud_Actual -= 2; // Reduce la vida de la unidad al ser impactado por una bala.
        }
    }
    void OnTriggerStay(Collider collider)
    {
        if (collider.gameObject.CompareTag("Unidad") && contador <= 0 && atacado_por_unidades == true)
        {
            salud_Actual -= 1; // Reduce la vida de la unidad al ser impactado por una bala.
            contador = frecuenciaUnidad;
        }
    }

    public void Curar(int curacion)
    {
        if (salud_Actual < salud_Maxima)
        {
            salud_Actual += curacion;
        }
    }
    public bool Esta_Muerto { get => esta_Muerto; set => esta_Muerto = value; }
}
  • Se hizo empezó a implementar el código de oleadas. (Daniela)

Code: Select all

{

    [SerializeField]
    private int waves;
    [SerializeField]
    private int[] enemiesPerWave;
    [SerializeField]
    private Transform enemyPrefab;
    [SerializeField]
    private Transform spawnPoint;
    [SerializeField]
    private float timeBetweenWaves;
    [SerializeField]
    private float timeBetweenEnemies;
    [SerializeField]
    private float countdown;
    [SerializeField]
    private int waveNumber = 0;
    [SerializeField]
    public bool wavesCompleted;
    [SerializeField]
    private int enemySpawnCount;

    void spawnEnemy()
    {
        //enemiesPerWave = new int[];
        Instantiate(enemyPrefab, spawnPoint.position, spawnPoint.rotation);
    }

    IEnumerator spawnWave()
    {
        enemySpawnCount = enemiesPerWave[waveNumber];

        for(int i = enemySpawnCount; i > 0; i--)
        {
            spawnEnemy();
            yield return new WaitForSeconds(timeBetweenEnemies);
        }
    }
   

    // Update is called once per frame
    void Update()
    {
        if (countdown <= 0f && waveNumber != waves)
        {
            StartCoroutine(spawnWave());
            countdown = timeBetweenWaves;
            waveNumber++;
        }
        else if(waveNumber == waves) { wavesCompleted = true; }
        countdown -= Time.deltaTime;
        countdown = Mathf.Clamp(countdown, 0f, Mathf.Infinity);
       
    }
}
¿Qué falta por hacer?
  • Empezar a hacer los diagramas de clases y preparación de la presentación para la pre entrega.
  • Grabar un game play con lo que se lleva hasta el momento.
¿Qué dificultades hemos tenido?

Problemas a la hora de asignación de tareas.
Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

User avatar
kr29
Posts: 5
Joined: Fri Jan 24, 2020 2:21 pm

Re: Tower Defense - Walls Games

Post by kr29 » Sat Mar 28, 2020 12:52 am

¿Que hemos hecho?
se implemento el codigo para comprar torres, se actualizo informacion de la clase ponertorre, torre, y hud.

Code: Select all

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

public class HUD : MonoBehaviour
{
    private static HUD instancia;
    [SerializeField]
    private Text monedas;
    private static int contador_monedas;

    public static int Contador_monedas 
    {
        get => contador_monedas; set => contador_monedas = value;
    }

    public static void ActualizarMoneda(int valor)
    {
        Contador_monedas += valor;
    }
    public static HUD Getinstance()
    {
        return instancia;
    }

    private void Start()
    {
        instancia = this;
        contador_monedas = 300;
    }

    // Update is called once per frame
    void Update()
    {
        monedas.text = Contador_monedas.ToString();  
    }
    public void DescontarSaldo(int valor)
    {
        contador_monedas -= valor;
        StartCoroutine("CambiarColorSaldo",Color.black);
    }
    public void ErrorSaldoInsuficiente()
    {

    }
    public IEnumerator CambiarColorSaldo(color color)
    {
        monedas.color = color;
        yield return new WaitForSeconds(.5f);
        ResetearColorSaldo();
    }
    public void ResetearColorSaldo()
    {
        monedas.color = color.white;
    }
}
se implemento nueva informacion a la clase hud

Code: Select all

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

public class Torre : MonoBehaviour
{
    private bool esta_activa;
    public GameObject enemigo;
    private float distancia_umbral = 2;
    private float tiempo_disparo;
    private Gameobject[] balas;
    private int valor_actual;

    public Torre()
    {
        valor_actual = 150;
    }

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

    // Update is called once per frame
    void Update()
    {
        enemigo = BuscarEnemigoCercano();
        if (enemigo!=null)
        {
            Debug.DrawLine(this.transform.position, enemigo.transform.position, Color.white);
        }
    }

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

    GameObject BuscarEnemigoCercano()
    {
        ArrayList enemigos = PoolingUnidades.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; }

}
Correccion Codigo Torre

Code: Select all

using UnityEngine;
using System.Collections;

public class PonerTorre : MonoBehaviour
{ 
    [SerializeField]   
    private GameObject go_torre;
    private Hud hud;
    private Torre torre; 

    void OnMouseDown()
    {
        GameObject temp;
        Vector3 pos = this.transform.position;
        pos.y = pos.y + .4f;
        temp = Instantiate(torre);
        temp.transform.position = pos;
        temp.layer = 5;
        hud = Hud.GetInstance();
        torre = temp.Getcomponent<Torre>();

        if (torre.Valor_actual <= hud.Contador_moneda)
        {
           torre.Esta_activa = true;
           Destroy(this.gameObject);
           hud.DescontarSaldo(torre.Valor_actual);
        }
        else
        { 
            Destroy(temp);
            hud.ErrorSaldoInsuficiente();
        }


    }


}
cambios en la lógica de la torre

¿Que falta por hacer?
- el control de torres
- control de ejecución

¿Que dificultades hemos tenido?
- el visual studio se actualizo a ultima hora por eso me tarde en publicar, tengo la foto pero no la pude subir, como puede ver lo subi a las 12.50.

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Wed Apr 01, 2020 2:27 pm

¿Qué hemos hecho?
  • presentación: (Daniela)
  • GamePlay (Daniela):
  • Se creó diagrama de clases (está en la presentación). (Daniela)
  • Se actualizó el código de torre, bala, moneda, salud y vida. (Daniela)
  • Se corrigieron errores de código. (Daniela)
  • Se implementó mejoras de torres, aun no sale el nuevo sprite. (Daniela)
  • Se implementó el menú. (Daniela)
  • Se implementaron las pantallas de perder y ganar (Daniela)
  • Se solucionaron problemas del HUD, ahora elimina corazones cuando pierde vida y aumenta monedas cuando elimina a enemigo (Daniela)
  • Se solucionó el problema de las balas que desaparecían en el escenario (Daniela)
¿Qué falta por hacer?
  • Que los enemigos salgan por varias rutas.
  • Que salga el nuevo sprite de la mejora de torre.
  • Unir diagrama de clases.
¿Qué dificultades hemos tenido?

Se ha tenido problemas con la asignación y realización de tareas.
Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Fri Apr 03, 2020 8:28 pm

¿Qué hemos hecho?
  • Se realizaron las relaciones en el diagrama de clases.
Image
  • Se actualizó la presentación.


¿Qué vamos a hacer?
  • Implementación de sprites de mejoras de torres.
  • Implementación de otros enemigos.
¿Qué dificultades hemos tenido?

En la comunicación de grupo.
Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

User avatar
kr29
Posts: 5
Joined: Fri Jan 24, 2020 2:21 pm

Re: Tower Defense - Walls Games

Post by kr29 » Sat Apr 04, 2020 1:31 am

Gameplay con subtitulos.

https://youtu.be/TrvarU-sQYQ

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Wed Apr 15, 2020 10:20 pm

¿Qué se ha hecho?
  • Se implementó el nuevo sprite cuando se comprara la mejora de torres.(Daniela)


Sprites:

Image
Primera mejora.

Image
Segunda mejora.

¿Qué falta por hacer?
  • Agrandar el sprite porque casi no se ve mientras se juega.(Daniela)
  • Implementación del botón de pausa.(Daniela)
¿Qué dificultades hemos tenido?
Ninguna hasta el momento.
Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Fri Apr 17, 2020 3:18 pm

¿Qué hemos hecho?
  • Se arregló el problema del tamaño de las torres.(Daniela)
  • Se implementó el botón de pausa.(Daniela)


¿Qué vamos a hacer?
  • La programación del botón y el menú de pausa.(Daniela)
  • Se implementará el audio en el nivel.(Daniela)
  • Se creará el panel de instrucciones.(Daniela)
  • Se actualizará diagrama de clases y presentación.(Daniela)
¿Qué dificultades hemos tenido?

Ninguna hasta el momento.
Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

User avatar
daniela.atencia
Posts: 80
Joined: Tue Jan 22, 2019 6:20 am

Re: Tower Defense - Walls Games

Post by daniela.atencia » Wed Apr 29, 2020 1:34 pm

Gameplay:

Por favor, activar los subtítulos.



Presentación:

Daniela Atencia

Programación y diseño orientado a objeto, 2020-1.

Post Reply