Comedores de Mana / HIKARI entertainment

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

Moderator: julianmartinez16

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

Re: Comedores de Mana / HIKARI entertainment

Post by xacarana » Fri May 03, 2019 3:42 pm

Image

¡Strike! No hubo evidencia de avance en los dos últimos post, todavía tienen tiempo de corregir el de hoy.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
danhercha
Posts: 37
Joined: Wed Jan 30, 2019 3:07 pm
Location: Medellín

Re: Comedores de Mana / HIKARI entertainment

Post by danhercha » Fri May 03, 2019 4:40 pm

¿Qué hemos hecho?
Pedimos ayuda a algunos compañeros que saben de Unity para asesorarnos en el juego.
Hemos organizado varios elementos del juego, como por ejemplo, poner los sprites hacer que funcionen.
Cambiamos un poco el movimiento de los personajes.
Ya configuramos los 3 tipos de aliados y los 3 tipos de enemigos.
¿Qué vamos a hacer?
Vamos a terminar de pulir algunos movimientos y corregir errores
¿Qué dificultades hemos tenido?
Con la ida del compañero del grupo, como se dijo en un post pasado, fue un poco difícil ya que él fue quién dio la idea del juego. Pero hasta ahora hemos acordado Alvaro y yo, de cómo terminar el código
Demostración en el video:
Last edited by danhercha on Sat May 04, 2019 7:55 pm, edited 3 times in total.
Daniela Hernández Chavarro

User avatar
danhercha
Posts: 37
Joined: Wed Jan 30, 2019 3:07 pm
Location: Medellín

Re: Comedores de Mana / HIKARI entertainment

Post by danhercha » Fri May 03, 2019 4:45 pm

Daniela Hernández Chavarro

User avatar
danhercha
Posts: 37
Joined: Wed Jan 30, 2019 3:07 pm
Location: Medellín

Re: Comedores de Mana / HIKARI entertainment

Post by danhercha » Tue May 07, 2019 9:39 pm

¿Qué hemos hecho?
Luego de quedar con el prgrama, organizamos los nombres de algunas clases y creamos nuevos métodos.

¿Qué vamos a hacer?
Vamos a agregar los últimos sprites para pulir el código

¿Qué dificultades hemos tenido?
Hasta hora el reunirnos en persona para avanzar, pero todo lo hemos realizado por skype

Clase contador de enemigos:

Code: Select all

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

public class contadorEnemigos : MonoBehaviour
{
    public int nEnemigos;
    public int nAliados;
    public short queZonaEs;

    void Start()
    {
        nEnemigos = 0;
        nAliados = 0;
        Debug.Log(nEnemigos+" enemigos vs "+nAliados+" aliados");
    }

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("enemigo")) 
        {
            nEnemigos++;                //si detecta otro enemigo entrando al collider, sumele 1
        }
        if (other.CompareTag("soldado1"))
        {
            nAliados++;
            //Debug.Log("nAliados: "+ nAliados);
        }

    }
    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("enemigo"))
        {
            nEnemigos--;
        }
        if (other.CompareTag("soldado1")) nAliados--;
    }

    public void enemigosResta()
    {
        nEnemigos--;
    }

    public void aliadosResta()
    {
        nAliados-=2;    //menos dos debido a un problema que hace que cuando un aliado entre a la zona de daño sume 2 a la cantidad de ellos.
    }

    void Update()
    {
        if (nEnemigos < 0) nEnemigos = 0;       
       // Debug.Log(nEnemigos);         //me cuenta la cantidad de enemigos dentro de la zona
    }
}
Clase Salud del jugador:

Code: Select all

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

public class PlayerHealth : MonoBehaviour
{
    public int startingHealth;
    public int currentHealth;
    //public Slider healthSlider;
    public AudioClip deathClip;

    GameObject controlJ;
    short numeroCorto = 1;
    float timer;
    public float tiempoEntreDaño;
    public int cantidadDaño;
    GameObject zonaActiva;

    // Animator anim;
    AudioSource playerAudio;
    PlayerMovement playerMovement;
    
    bool isDead;
    bool damaged;
    int nEnemigoEnZona;    
    short zonaReposo; // identificador del soldado sobre que área esta parado para la resta en cantidad

    void Awake ()
    {
       // tiempoEntreDaño = 3;
       // anim = GetComponent <Animator> ();
        playerAudio = GetComponent <AudioSource> ();
        playerMovement = GetComponent <PlayerMovement> ();
        controlJ = GameObject.FindGameObjectWithTag("GameController");
        currentHealth = startingHealth;
        Random aleatorio = new Random();
        nEnemigoEnZona = 0;
        zonaActiva = GameObject.FindGameObjectWithTag("zonaAtaque");        
    }
    
    void Update ()
    {
        timer += Time.deltaTime;
        cantidadDaño = Random.Range(10,21);
        if (currentHealth <= 0 )
        {
            Death();
            Destroy(gameObject, 2f);
        }
        //Debug.Log("Soldado debe recibir daño cada: " + (tiempoEntreDaño / nEnemigoEnZona) + "s");
    }

    void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("enemigo") && timer >= (tiempoEntreDaño/nEnemigoEnZona))
        {
            currentHealth -= cantidadDaño;
            timer = 0;
            //Debug.Log("Daño recibido por soldado: "+ (cantidadDaño));
        }

        if (other.CompareTag("zonaAtaque"))
        {
            nEnemigoEnZona = other.GetComponent<contadorEnemigos>().nEnemigos;
            zonaReposo = other.GetComponent<contadorEnemigos>().queZonaEs;
        }
    }
    
        public void TakeDamage (int amount)
    {
        damaged = true;
        currentHealth -= amount;
       // healthSlider.value = currentHealth;
        playerAudio.Play ();
        if(currentHealth <= 0 && isDead==false)
        {
            Death ();            
            Destroy(gameObject, 2f);
        }
    }

    void Death ()
    {
        isDead = true;
        controlJ.GetComponent<aliadoManager>().SpawnResta(zonaReposo);
        //playerShooting.DisableEffects ();
        // anim.SetTrigger ("Muere");
        playerAudio.clip = deathClip;
        playerAudio.Play ();
        if (numeroCorto == 1)
        {
            zonaActiva.GetComponent<contadorEnemigos>().aliadosResta();
            numeroCorto++;
            controlJ.GetComponent<aliadoManager>().SpawnResta(zonaReposo);
        }
        
        //Destroy(gameObject,2f);
        //playerMovement.enabled = false;
        //playerShooting.enabled = false;
    }

   public void RestartLevel ()
   {
        SceneManager.LoadScene (5);
   }
}
Clase Disparo del Jugador:

Code: Select all

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

public class DisparoJugador : MonoBehaviour {

	public GameObject disparo;//llama el prefab al escenario
	public float cadenciaDisparo; //velocidad de disparo
	bool habilitarSonido = true;
	private AudioSource audioSource; //necesario para llamar el audio del disparo
	private float proximoDisparo; // a esta variable se le suma la cadencia del disparo y esta dice cada cuanto puede salir uno nuev
	bool habilitarLlamas = false;
          
	void Update ()
	{
        }

	void OnTriggerEnter(Collider other)
	{
		if (other.CompareTag ("Llamas"))
		{
			habilitarLlamas = true;   
			Debug.Log ("se habilitó lanza llamas");
		}
    }
}
Clase Salud del enemigo:

Code: Select all

using UnityEngine;

public class EnemyHealth : MonoBehaviour
{
    public int startingHealth = 100;
    public int currentHealth;
    public int scoreValue = 1;
    public AudioClip deathClip;

    public int cantidadDaño = 20;   //Cantidad de daño RECIBIDO (No proporcionado)
    float timer;
    public float tiempoEntreDaño;

    Animator anim;
    AudioSource enemyAudio;
    ParticleSystem hitParticles;
    BoxCollider boxCollider;
    bool isDead;
    UnityEngine.AI.NavMeshAgent nav;    //acceder al navMsh para cambiar su velocidad

    int tipoEnemigo;        //Cual de los 3 enemigos es este ... influye en daño, vida y velocidad

    Light colorLuz;

    GameObject zonaActiva;
    int cantidadEnemigos;   //Numero por el que será dividido el daño (cuantos enemigos hay dentro del área)
    int cantidadAliados;    //Numero por el que será multiplicado el daño (cuantos aliados hay dentro del área)

    void Awake ()
    {
        anim = GetComponent <Animator> ();
        enemyAudio = GetComponent <AudioSource> ();

        Random aleatorio = new Random();
        tipoEnemigo = Random.Range(1, 3);

        boxCollider = GetComponent <BoxCollider> ();
        currentHealth = startingHealth;

        nav = GetComponent<UnityEngine.AI.NavMeshAgent>();

        zonaActiva = GameObject.FindGameObjectWithTag("zonaAtaque");
        cantidadEnemigos = zonaActiva.GetComponent<contadorEnemigos>().nEnemigos;
        cantidadAliados = zonaActiva.GetComponent<contadorEnemigos>().nAliados;

        colorLuz = GetComponent<Light>();

    }
    private void Start()
    {
        if (tipoEnemigo == 1)
        {
            startingHealth = 100;   //vida inicial  
            cantidadDaño = 20;      //Cuanto daño recibe
            tiempoEntreDaño = 1;    //cada cuanto lo recibe
            nav.speed = 1f;         //velocidad del enemigo
            colorLuz.color =Color.blue;     //color caracteristico con el cual alumbra
        }
        if (tipoEnemigo == 2)
        {
            startingHealth = 150;
            cantidadDaño = 20;
            tiempoEntreDaño = 2;
            nav.speed = 0.5f;
            colorLuz.color = Color.red;
        }
        if (tipoEnemigo > 2)
        {
            startingHealth = 50;
            cantidadDaño = 30;
            tiempoEntreDaño = 1;
            nav.speed = 1.5f;
            colorLuz.color = Color.green;
        }

    }

    void Update ()
    {
        timer += Time.deltaTime;
        cantidadEnemigos = zonaActiva.GetComponent<contadorEnemigos>().nEnemigos;
        cantidadAliados = zonaActiva.GetComponent<contadorEnemigos>().nAliados;
    }

    void OnTriggerStay(Collider other)
    {
        if (isDead)
            return;

        if (other.CompareTag("zonaAtaque")&& timer>= tiempoEntreDaño)
        {
            int resta = (cantidadDaño / cantidadEnemigos) * (cantidadAliados/2);
           
            currentHealth -= resta;
            timer = 0;
            //Debug.Log(resta);
            //Debug.Log("recive daño"+" "+(cantidadDaño/cantidadEnemigos)*cantidadAliados);
        }

        if (currentHealth <= 0)
        {
            Death();
            GetComponent<UnityEngine.AI.NavMeshAgent>().enabled = false;
        }
    }

   void Death ()
    {
        isDead = true;
		Debug.Log ("funciona");
        boxCollider.isTrigger = true;
		GetComponent <Rigidbody> ().isKinematic = true;
		GetComponent <UnityEngine.AI.NavMeshAgent>().enabled = false;
        //anim.SetTrigger ("Muerte");
		Destroy (gameObject, 2f);
        //ScoreManager.score += scoreValue;
        //BossManager.muertes += 1;
        zonaActiva.GetComponent<contadorEnemigos>().enemigosResta();
        enemyAudio.clip = deathClip;
        enemyAudio.Play ();
    }    
}
Clase Movimiento del Enemigo:

Code: Select all

using UnityEngine;
using System.Collections;

public class EnemyMovement : MonoBehaviour
{
    Transform player;
   // PlayerHealth playerHealth;
    EnemyHealth enemyHealth;
    UnityEngine.AI.NavMeshAgent nav;

    void Awake ()
    {
        player = GameObject.FindGameObjectWithTag ("Player").transform;
        //playerHealth = player.GetComponent <PlayerHealth> ();
        enemyHealth = GetComponent <EnemyHealth> ();
        nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();
    }

    void Update ()
    {
        if(enemyHealth.currentHealth > 0 )
        {
            nav.SetDestination (player.position);   //Posicion del orbe de cristal
        }
        else
        {
           nav.enabled = false;
        }
    }  

    private void OnTriggerStay(Collider other)
    {
        if (other.CompareTag("soldado1")&& other.CompareTag("zonaAtaque"))
        {
            nav.enabled = false;
        }
        else nav.enabled = true;
    } 
}
Clase Ataque del Enemigo:

Code: Select all

using UnityEngine;
using System.Collections;

public class EnemyAttack : MonoBehaviour
{
    public float timeBetweenAttacks = 0.5f;
    public int attackDamage = 10;
    
    GameObject player;
    PlayerHealth playerHealth;
	EnemyMovement enemyMovement;
    EnemyHealth enemyHealth;
    bool playerInRange;
    float timer;

    void Awake ()
    {
        player = GameObject.FindGameObjectWithTag ("Player");
        playerHealth = player.GetComponent <PlayerHealth> ();
		enemyMovement = GetComponent <EnemyMovement> ();
        enemyHealth = GetComponent<EnemyHealth>();        
    }

    void OnTriggerEnter (Collider other)
    {
        if(other.gameObject == player)
        {
            playerInRange = true;			
			GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = false;
        }
    }

    void OnTriggerExit (Collider other)
    {
        if(other.gameObject == player)
        {
            playerInRange = false;
			
			GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = true;
        }
    }

    void Update ()
    {
        timer += Time.deltaTime; 

        if(timer >= timeBetweenAttacks && playerInRange && enemyHealth.currentHealth > 0)
        {
            Attack ();
        }

        if(playerHealth.currentHealth <= 0)
        {           
			enemyMovement.enabled = false;		
        }
    }

    void Attack ()
    {
        timer = 0f;

        if(playerHealth.currentHealth > 0)
        {
            playerHealth.TakeDamage (attackDamage);
        }
    }
}
Daniela Hernández Chavarro

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

Re: Comedores de Mana / HIKARI entertainment

Post by xacarana » Fri May 10, 2019 10:21 am

Image

Muy bien, falta un video o un gif, para ver que esta pasando graficamente con el juego.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
danhercha
Posts: 37
Joined: Wed Jan 30, 2019 3:07 pm
Location: Medellín

Re: Comedores de Mana / HIKARI entertainment

Post by danhercha » Sun May 12, 2019 11:10 am

¿Qué hemos hecho?
El otro compañero se puso a dibujar los sprites que faltaban
El juego programado tiene:
- La plata
- La vida

Falta:
- Arreglar el fallo para montar aliados
- Agunos carácteres gráficos

¿Qué vamos a hacer?
Arreglar lo que falta del código y poner los sprites

¿Qué dificultades hemos tenido?
Por los finales se nos ha dificultado reunirnos. Además que el compañero que se encarga de hacer los dibujos no ha podido avanzarlos por cuestiones familiares
Daniela Hernández Chavarro

User avatar
danhercha
Posts: 37
Joined: Wed Jan 30, 2019 3:07 pm
Location: Medellín

Re: Comedores de Mana / HIKARI entertainment

Post by danhercha » Sun May 12, 2019 12:16 pm

Daniela Hernández Chavarro

User avatar
danhercha
Posts: 37
Joined: Wed Jan 30, 2019 3:07 pm
Location: Medellín

Re: Comedores de Mana / HIKARI entertainment

Post by danhercha » Tue May 14, 2019 8:29 pm

¿Qué hemos hecho?
- Terminamos de dibujar los sprites para el juego y luego los agregamos al código.
- Se agregaron las monedas y vidas al código.
- Se corrigieron algunos errores como los movimientos de los enemigos.

¿Qué vamos a hacer?
- El juego está ya casi listo, nos falta es estudiarlo y pulir errores.

¿Qué dificultades hemos tenido?
- Gasta ahora ninguna, todo ha salido bien.
Image
Last edited by danhercha on Sat May 18, 2019 11:13 am, edited 1 time in total.
Daniela Hernández Chavarro

User avatar
Xti
Posts: 11
Joined: Tue Jan 22, 2019 2:10 pm

Re: Comedores de Mana / HIKARI entertainment

Post by Xti » Fri May 17, 2019 11:13 am

Image
Arquero Enemigo Ataque

Image
Arquero Enemigo Caminata

Image
Arquero Enemigo Idle

Image
Arquero Aliado Idle

Image
Arquero Aliado Ataque

Image
Arquero Aliado Caminata
Xti

User avatar
Xti
Posts: 11
Joined: Tue Jan 22, 2019 2:10 pm

Re: Comedores de Mana / HIKARI entertainment

Post by Xti » Fri May 17, 2019 11:15 am

Image
Golem Enemigo Ataque

Image
Golem Enemigo Caminata

Image
Golem Enemigo Idle

Image
Golem Aliado Caminata

Image
Golem Aliado Idle

Image
Golem Aliado Ataque
Xti

Post Reply