Waterman - Cydia Games

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

Moderator: julianmartinez16

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

Re: Waterman - Cydia Games

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

Image

Incluir un gif para complementar las evidencias, y el diagrama mejorar la imagen ya que se dificulta la lectura.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
DanielCadavid
Posts: 16
Joined: Thu Aug 30, 2018 5:08 pm

Re: Waterman - Cydia Games

Post by DanielCadavid » Fri May 10, 2019 12:05 am

Sprint #14

Fecha de inicio: 07/05/2019
Fecha final: 14/05/2019

Jueves: Se procederá a programar la parte del Game Over para que aparezca al final del juego y dos bottones los cuales retornar al juego y el otro para salir

Viernes: Se programara un conteo de vidas, para que cuando, estas lleguen a cero, retorne el Scene del Game Over.

Nuestra forma de trabajar, esta dividida en los dos dias, el primer daily se encargara Daniel Cadavid, y el segundo daily sera realizado por Kevin Vasco, vale aclarar que ambas tareas incluyen programacion.

Daily
  • Jueves, 9 de mayo
  • ¿Qué hemos hecho?
    Hemos logrado colocar la barra de vida en el enemigo y hacer que desaparezca al este morir

    ¿Qué haremos?
  • Se procederá a programar la parte del Game Over para que aparezca al final del juego y dos bottones los cuales retornar al juego y el otro para salir

    ¿Qué dificultades han tenido?
  • Sin problemas para la realización del daily
Para este daily se creo una nueva scena y un nuevo script llamado FuntionButtons

Code: Select all

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

public class FuntionButtons : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void TryAgain()
    {
        //GetComponent(Enemigo).startHealth = 100;
        Application.LoadLevel("SampleScene");

    }

    public void Exit() 
        {
        Application.Quit();
        } 

}
Evidencia del juego funcionando
Image
Daniel Felipe Cadavid Duque
POO #2

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

Re: Waterman - Cydia Games

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

Image

Muy bien, cuiden la estética del juego, lo básico. Por ejemplo la alineación de los puntos donde van las torres y el diseño de la ventana de game over.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
DanielCadavid
Posts: 16
Joined: Thu Aug 30, 2018 5:08 pm

Re: Waterman - Cydia Games

Post by DanielCadavid » Fri May 10, 2019 8:44 pm

Daily
  • Viernes, 10 de mayo

    ¿Qué hemos hecho?
  • Se procedió a programar la parte del Game Over para que aparezca al final del juego y dos bottones los cuales retornar al juego y el otro para salir

    ¿Qué haremos?
  • Haremos un cambio con respecto a lo planeado, para este daily realizaremos la corrección de errores tales como que los enemigos vayan por los dos caminos en vez de solo por uno, también seguiremos la recomendación del profe sobre la estética del juego. Por lo que lo planeado para este daily sera postergado para el día martes.

    ¿Qué dificultades han tenido?
  • Sin problemas para la realización del daily
Para este daily se realizaron cambios en los siguientes scripts
Script de Torre

Code: Select all

using UnityEngine;

public class Torre : MonoBehaviour
{
    #region Variables
    public Transform target;
    public Transform firePoint;
    public GameObject bulletPrefab;

    [Header("Atributos")] //
    private float fireRate;
    private float fireCountdown;
    public float range;

    [Header("Unity Setup Fields")]
    public string enemyTag= "Enemy";
    #endregion

    #region Start
    void Start() // 
    {
        /*
         * Invoke es una funcion del Unity. Consiste en invocar y repetir un metodo/accion. 
         */
        fireCountdown = 0f;
        fireRate = 1F;
        range = 2f;
        InvokeRepeating("UpdateTarget", 0f, 0.5f);
    }
    #endregion

    #region UpdateTarget
    void UpdateTarget() // 
    {
        // Buscamos un enemigo en el array y que a este le damos le disponibilidad de que este en el umbral y que si ocurre eso, lo convirtamos como un enemigo.
        GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag);
        GameObject nearestEnemy = null;
        float shortestDistance = Mathf.Infinity;
        foreach (GameObject enemy in enemies)
        {
            float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);

            if(distanceToEnemy <= shortestDistance)
            {
                shortestDistance = distanceToEnemy;
                nearestEnemy = enemy;
            }
        }
        //Si el enemigo existe y distancia mas corta este dentro del umbral lo convierte en un objetivo
        if(nearestEnemy != null && shortestDistance <= range)
        {
            target = nearestEnemy.transform;
        }
        else
        {
            target = null;
        }
    }
    #endregion

    #region Update
    /*
     * Si el objetivo no existe, no haga nada.
     * Empezamos con el disparo, aqui si el disparo esta disponible despues de X tiempo, disparara con la funcion Shoot y esperara un tiempo. "Recargar".
     */
    void Update()
    {
        if (target == null)
            return;

        if(fireCountdown <= 0f)
        {
            Shoot();
            fireCountdown = 1f / fireRate;
        }
        fireCountdown -= Time.deltaTime;
    }
    #endregion

    #region Shoot
    void Shoot()//invocar la funcion de la bala desde este script
    {
        GameObject bulletGO = (GameObject)Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Bullet bullet = bulletGO.GetComponent<Bullet>();

        if(bullet != null)
        {
            bullet.Seek(target);
        }
    }
    #endregion

    #region Gizmos
    //Para ver el umbral de cada torre.
    void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, range);
    }

    #endregion
}
Script de Enemigo

Code: Select all

using UnityEngine;
using UnityEngine.UI;

public class Enemigo : MonoBehaviour
{
    /*
     * Aqui le pasaremos los Waypoints para que el enemigo lo siga directamente y no tenga que realizar algun caluclo el enemigo, sino que siempre estara disponible la ruta para cualquier gameObject en caso de que se necesite
     * La velocidad que tienen los enemigos tambien esta aqui. 
     */
    private Waypoints[] Waypoints;
    private Waypoints WaypointToFollow;
    private Transform objetivo;
    private int wavePointIndex;
    public float velocidad;
    public float startHealth;
    private float health;
    private float dead;
    

    [Header("Unity Stuff")]
    public Image healthBar;

    private void Awake()
    {
        Waypoints = (Waypoints[])FindObjectsOfType(typeof(Waypoints));
        WaypointToFollow = Waypoints[new System.Random().Next(0, Waypoints.Length)];
    }

    // El objetivo es el primer nodo, o sea, el 0 y luego le daremos la direccion hacia ese nodo.
    private void Start()
    {
        startHealth = 100;
        velocidad = 1f;
        wavePointIndex = 0;

        objetivo = WaypointToFollow.nodos[0];
        health = startHealth;
    }
    public void TakeDamage(int amount)
    {
        health -= amount;
        healthBar.fillAmount = health / startHealth;
        if (health <= 0)
        {
            Die();
        }

    }

    void Die()
    {
       
        Destroy(gameObject);


    }

    private void Update()//
    {
        Vector3 dir = objetivo.position - transform.position;
        transform.Translate(dir.normalized * velocidad * Time.deltaTime, Space.World);

        if (Vector3.Distance(transform.position, objetivo.position) <= .4f)
        {
            ProximoWaypoint();
        }
    }

    // Este es para calcular el proximo nodo que tendra que seguir el enemigo.
    void ProximoWaypoint()
    {
        if (wavePointIndex >= WaypointToFollow.nodos.Length - 1)
        {
            EndPath();
            return;

        }

        wavePointIndex++;
        objetivo = WaypointToFollow.nodos[wavePointIndex];
    }

    void EndPath()
    {
        PlayerStats.Lives--;
        Destroy(gameObject);
    }

}
Script de LogicaPonerTorre

Code: Select all

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

public class LogicaPonerTorre : MonoBehaviour
{
    /*
     * La logica de poner torre de siempre, nada raro. 
     */
    public GameObject torre;
    public Vector3 Offset; 
    private void OnMouseDown()
    {
        GameObject temp;
        Vector3 pos = this.transform.position + Offset; //  vector3 de posicion puede dar direccion o una coordenada
        temp = Instantiate(torre);
        temp.transform.position = pos;
        temp.layer = 10;
        Destroy(this.gameObject);

    }
}
Script de FuntionButtons

Code: Select all

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

public class FuntionButtons : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void TryAgain()
    {
       // GetComponent(Enemigo).startHealth = 100;

        Application.LoadLevel("SampleScene");

    }

    public void Exit() 
        {
#if UNITY_EDITOR

        UnityEditor.EditorApplication.isPlaying = false;
#else
         Application.Quit();
#endif
    }

}
Script de Waypoints

Code: Select all

using UnityEngine;

public class Waypoints : MonoBehaviour
{   
    /*
     * Se crea un array de transform que es un componente que determina la posicion, rotacion y escala de un gameObject (objeto dentro del juego).
     * Se hace con la utilidad de guardar cada nodo en la ruta.
     * Esto es para que el enemigo no tenga que trabajar buscando la posicion de cada nodo, sino que directamente es pasado al apenas iniciar.
    */
    public Transform[] nodos;

    /*
     * Como el Start y Update, el Awake es algo fundamental del codigo. Awake es que la funcion hace que siempre este activa es parte del codigo asi este o no funcionando el codigo.
     */

    private void Awake() // siempre estara activo este trozo de codigo asi no este corriendo el juego
    {
        /*
         *Aqui estoy guardando el componente transform del gameObject, o sea, cada nodo que hay en la ruta, en un array. 
         */
        nodos = new Transform[transform.childCount];
        for (int i = 0; i < nodos.Length; i++)
        {
            nodos[i] = transform.GetChild(i);
        }
    }
}
Evidencia de la corrección de los indicadores de las torres
Image

Evidencia de las torres correctamente colocadas en los indicadores
Image

Evidencia de la corrección de las rutas por donde van los enemigos
Image

Posdata:El Internet daña la mente :v
Image
Daniel Felipe Cadavid Duque
POO #2

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Tue May 14, 2019 11:51 pm

Sprint #15

Fecha de inicio: 14/05/2019
Fecha final: 17/05/2019

Martes:
  • Implementar las recomendaciones del profesor para el proyecto en cuanto a código.
Viernes:
  • Implementar la funcionalidad del Game Over acorde con la finalización del juego por distintos medios de finalización.
  • Pulimiento de detalles finales.

Daily

Martes, 14 de Mayo.

¿Qué hemos hecho?

Hemos corregido errores cruciales que impedían el correcto funcionamiento del juego y mejorado estéticas del juego.

¿Qué haremos?

Aplicaremos una manera de reutilización de los enemigos para dejar la implantación del Object.Destroy() y agregar una nueva manera mas jovial de contar las vidas del jugador para una mejor estética del juego.

¿Qué dificultades han tenido?

Tuvimos inconvenientes con buscar una manera de reutilizar los enemigos lo cual nos retraso en tiempo y postergo la finalización del nuevo contador de vida. A causa de esto no se pudo completar el contador de vidas completo para este daily.


Evidencias

Image


Codigos modificados

Enemigo

Code: Select all

using UnityEngine;
using UnityEngine.UI;

public class Enemigo : MonoBehaviour
{
    /*
     * Aqui le pasaremos los Waypoints para que el enemigo lo siga directamente y no tenga que realizar algun caluclo el enemigo, sino que siempre estara disponible la ruta para cualquier gameObject en caso de que se necesite
     * La velocidad que tienen los enemigos tambien esta aqui. 
     */
    private Waypoints[] Waypoints;
    private Waypoints WaypointToFollow;
    private Transform objetivo;
    private Vector3 posicion;
    private int wavePointIndex;
    private float health;
    public float velocidad;
    public float startHealth;

    public Image healthBar;

    private void Awake()
    {
        Waypoints = (Waypoints[])FindObjectsOfType(typeof(Waypoints));
        WaypointToFollow = Waypoints[new System.Random().Next(0, Waypoints.Length)];
    }

    // El objetivo es el primer nodo, o sea, el 0 y luego le daremos la direccion hacia ese nodo.
    private void Start()
    {
        startHealth = 100;
        velocidad = 1f;
        wavePointIndex = 0;
        posicion = transform.position;
        objetivo = WaypointToFollow.nodos[0];
        health = startHealth;
    }
    public void TakeDamage(int amount)
    {
        health -= amount;
        healthBar.fillAmount = health / startHealth;
        if (health <= 0)
        {
            Die();
        }
    }

    public void Die()
    {
        transform.position = posicion;
        Start();
    }

    private void Update()
    {
        Vector3 dir = objetivo.position - transform.position;
        transform.Translate(dir.normalized * velocidad * Time.deltaTime, Space.World);
        if (Vector3.Distance(transform.position, objetivo.position) <= .4f)
        {
            ProximoWaypoint();
        }
    }

    // Este es para calcular el proximo nodo que tendra que seguir el enemigo.
    void ProximoWaypoint()
    {
        if (wavePointIndex >= WaypointToFollow.nodos.Length - 1)
        {
            EndPath();
            return;
        }
        wavePointIndex++;
        objetivo = WaypointToFollow.nodos[wavePointIndex];
    }

    void EndPath()
    {
        PlayerStats.Lives--;
        Die();
    }
}
Kevin Alejandro Vasco Hurtado
PDOO #2

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Tue May 21, 2019 6:08 pm

Daily
Viernes, 17 de mayo

¿Qué hemos hecho?
Se aplico lo dicho el daily pasado referente al Object.Destroy() y se agrego la imagen del nuevo contador de vidas.

¿Qué haremos?
Hemos dado funcionalidad al contador de vidas en base a imagenes y mejoraremos la cohesion del codigo.

¿Qué dificultades han tenido?
Sin problemas para la realización del daily.


Evidencias

Image

Codigo Modificados

Code: Select all

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

public class PlayerStats : MonoBehaviour
{
    public static int Lives;
    public int startLives;

    void Start()
    {
        startLives = 5;
        Lives = startLives;
    }

    void Update()
    {
        if(Lives <= 0)
        {
            SceneManager.LoadScene("GameOver");
        }        
    }
}

Nuevo Codigo

Code: Select all

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

public class HUD : MonoBehaviour
{
    public Sprite[] HeartSprites;
    public Image HeartUI;

    private void Update()
    {
        HeartUI.sprite = HeartSprites[PlayerStats.Lives];
    }
}
Kevin Alejandro Vasco Hurtado
PDOO #2

User avatar
DanielCadavid
Posts: 16
Joined: Thu Aug 30, 2018 5:08 pm

Re: Waterman - Cydia Games

Post by DanielCadavid » Thu May 23, 2019 11:40 pm

Sprint #16


Fecha de inicio: 07/05/2019
Fecha final: 14/05/2019

Jueves: Se procederá a programar por sugerencia del profe, el contador de monedas

aily
  • Jueves, 9 de mayo
  • ¿Qué hemos hecho?
    Hemos dado funcionalidad al contador de vidas en base a imagenes y mejoraremos la cohesion del codigo.


    ¿Qué haremos?
  • Se procederá a programar por sugerencia del profe, el contador de monedas


    ¿Qué dificultades han tenido?
  • Sin problemas para la realización del daily
Evidencia contador de monedas
Image
Daniel Felipe Cadavid Duque
POO #2

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Fri May 31, 2019 3:12 pm

Waterman

Gameplay


Diagrama de Clase
Image

Link de descarga: https://upbeduco-my.sharepoint.com/:f:/ ... g?e=atiPKj
Kevin Alejandro Vasco Hurtado
PDOO #2

User avatar
DanielCadavid
Posts: 16
Joined: Thu Aug 30, 2018 5:08 pm

Re: Waterman - Cydia Games

Post by DanielCadavid » Fri May 31, 2019 3:50 pm

Poster
Image
Daniel Felipe Cadavid Duque
POO #2

Post Reply