Waterman - Cydia Games

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

Moderator: julianmartinez16

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Fri Mar 29, 2019 11:53 pm

Daily

Viernes, 29 de Marzo.

¿Qué hemos hecho?
Hemos corregido errores fatales del juego y borrado otros scripts con el fin de usar nuevos modos hacer las acciones necesarias en el juego.

¿Qué haremos?
Realizaremos el gameplay del juego en funcionamiento.
Agregaremos y modificaremos scripts.
Volver a implementar scripts ya previamente puestos debido a una dificultad presentada.

¿Qué dificultades han tenido?
Al guardar el juego en GitHub, por alguna razon corrompia algunos archivos del juego haciendo obsoleto todo el proyecto.
Dicho error se presentaba en varios commits los cuales antes no se presentaban dicho error.
La dificultad fue solucionada volviendo a una version del juego que estaba guardada en el computador del compañero Daniel, pero la cual era de una version antigua, asi que reiniciamos de nuevo con los avances ya presentados en los dailys, pero que por el momento no hemos llegado al punto del avance del juego que presentabamos la semana pasada.
El enemigo no aparece en el modo Game, solamente en el modo Scene.

Evidencias

Video ya grabado del funcionamiento del juego v1.0.
Image
Kevin Alejandro Vasco Hurtado
PDOO #2

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Tue Apr 02, 2019 3:22 pm

Preentrega

Gameplay del juego


Presentacion
Kevin Alejandro Vasco Hurtado
PDOO #2

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Fri Apr 05, 2019 11:08 pm

Sprint #10

Fecha de inicio: 02/04/2019
Fecha final: 05/04/2019

Miércoles: Se presentará el proyecto como preentrega y estaremos a la espera a los comentarios del profesor para el mejoramiento del proyecto.

Viernes: Se aplicará las correcciones dadas por el profesor durante la preentrega y se continuará con la recuperación de los scripts.


Daily

Martes, 2 de Abril

¿Qué hemos hecho?
Hemos avanzado en la recuperación de archivos perdidos del juego y hemos finalizado los preparativos para la preentrega

¿Qué haremos?
Se presentará el proyecto como preentrega y estaremos a la espera a los comentarios del profesor para el mejoramiento del proyecto.

¿Qué dificultades han tenido?
Aun estamos recuperando archivos perdidos en la corrupción ocurrida hace unas semanas y esto presenta un retraso al cronograma usual.
Kevin Alejandro Vasco Hurtado
PDOO #2

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Fri Apr 05, 2019 11:30 pm

Viernes, 5 de Abril

¿Qué hemos hecho?
Se presento la preentrega y hemos recibido los correctivos a hacer para el avance del juego.

¿Qué haremos?
Se aplicarán los correctivos necesarios dichos por el profesor que consisten en dejar los datos miembros como privados y su instancia dentro del método Start.

¿Qué dificultades han tenido?
No hemos tenido buena disponibilidad de tiempo para poder dar mayor énfasis a la continuación del juego y aplicacion de todos los correcitvo a causa de situaciones personales y académicas de cada uno de nosotros.

Tarea:
Dejar de usar Destroy(gameObject) en el codigo del juego.

Evidencias

Bullet

Code: Select all

using UnityEngine;

public class Bullet : MonoBehaviour
{
    private Transform target;
    private float speed;

    private void Start()
    {
        speed = 4f;
    }

    void Update()
    {
        if(target == null)
        {
            Destroy(gameObject);
            return;
        }

        Vector3 dir = target.position - transform.position;
        float distanceThisFrame = speed * Time.deltaTime;

        if(dir.magnitude <= distanceThisFrame)
        {
            HitTarget();
            return;
        }

        transform.Translate(dir.normalized * distanceThisFrame, Space.World);
    }

    public void Seek(Transform _target)
    {
        target = _target;
    }

    void HitTarget()
    {
        Destroy(target.gameObject);
        return;
    }
}
Torre

Code: Select all

using UnityEngine;

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

    private float fireRate;
    private float fireCountdown;
    private float range;

    public string enemyTag= "Enemy";
    #endregion

    #region Start
    void Start()
    {
        fireRate = 1f;
        fireCountdown = 0f;
        range = 2f;
        
        InvokeRepeating("UpdateTarget", 0f, 0.5f);
    }
    #endregion

    #region UpdateTarget
    void UpdateTarget()
    {
        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;
            }
        }

        if(nearestEnemy != null && shortestDistance <= range)
        {
            target = nearestEnemy.transform;
        }
        else
        {
            target = null;
        }
    }
    #endregion

    #region Update
    void Update()
    {
        if (target == null)
            return;

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

    #region Shoot
    void Shoot()
    {
        GameObject bulletGO = (GameObject)Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Bullet bullet = bulletGO.GetComponent<Bullet>();

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

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

    #endregion
}
Pooling Unidades

Code: Select all

using System.Collections;
using UnityEngine;

public class PoolingUnidades : MonoBehaviour
{
    public GameObject enemigo;
    public Transform spawnPoint;

    private float contador;
    private int waveIndex;
    private float tiempoEntreOleadas;

    private void Start()
    {
        contador = 2f;
        waveIndex = 0;
        tiempoEntreOleadas = 20f;
    }

    private void Update()
    {
        if (contador <= 0f)
        {
            StartCoroutine(SpawnWave());
            contador = tiempoEntreOleadas;
        }

        contador -= Time.deltaTime;
    }

    IEnumerator SpawnWave()
    {
        waveIndex++;

        for (int i = 0; i < waveIndex; i++)
        {
            SpawnEnemy();
            yield return new WaitForSeconds(0.5f);
        }
    }

    void SpawnEnemy()
    {
        Instantiate(enemigo, spawnPoint.position, spawnPoint.rotation);
    }
}

Enemigo

Code: Select all

using UnityEngine;

public class Enemigo : MonoBehaviour
{
    private Transform objetivo;
    private int waypointIndex ;
    private float velocidad;

    private void Start()
    {
        waypointIndex = 0;
        velocidad = 0.8f;

        objetivo = Waypoints.nodos[0];
    }

    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();
        }
    }

    void ProximoWaypoint()
    {
        if (waypointIndex >= Waypoints.nodos.Length - 1)
        {
            Destroy(gameObject);
            return;
        }

        waypointIndex++;
        objetivo = Waypoints.nodos[waypointIndex];
    }
}
Kevin Alejandro Vasco Hurtado
PDOO #2

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

Re: Waterman - Cydia Games

Post by DanielCadavid » Tue Apr 09, 2019 10:07 pm

Sprint #11

Fecha de inicio: 09/04/2019
Fecha final: 16/04/2019

Martes: se iniciara con la programación de la parte del conteo de vidas para las cuales nos basaremos en un par de video que se encuentran en ingles.

Viernes: se retomara lo realizado en el dia martes con tal de solucionar, posibles errores y continuar con lo visualizado en los videos de apoyo para este concepto del conteo de las vidas

Nuestra forma de trabajar, esta dividida en los dos dias, el martes se encargara Daniel Cadavid, y el día viernes Kevin Vasco, vale aclarar que ambas tareas incluyen programacion.

Daily

Martes, 9 de Abril
  • ¿Qué hemos hecho?
  • hemos atendimos a la sugerencia del profesor en la pre-entrega con respecto a tener las variables privadas en vez dde publicas e inicializarlas en el start

    ¿Qué haremos?
  • se iniciara con la programación de la parte del conteo de vidas para las cuales nos basaremos en un par de video que se encuentran en ingles,

    ¿Qué dificultades han tenido?
  • Se tuvieron unos errores los cuales no, aparece el conteo de la vida, estando ya todo programado en los scripts, se espera que el compañero kevin que domina mas la lengua ingles, pueda detectar los errores con base al video instructivo el cual se encuentra en ingles
Para esta parte se crearon 3 nuevos scripts

Script GameManager

Code: Select all

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

public class GameManager : MonoBehaviour
{
    private bool gameEnded = false;

    void Update()
    {
        if (gameEnded)
        
            return;
        
        if (PlayerStats.Lives <= 0)
        {
            EndGame();
        }
    }

    void EndGame()
    {
        gameEnded = true;
        Debug.Log("Game Over!");
    }

}

Script PlayerStats

Code: Select all

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

public class PlayerStats : MonoBehaviour
{
    public static int Lives;
    public int startLives = 20;
    // Start is called before the first frame update
    void Start()
    {
        Lives = startLives;
    }

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

Script LiveUI

Code: Select all

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

public class LiveUI : MonoBehaviour
{
    public Text livesText;
    // Start is called before the first frame update

    // Update is called once per frame
    void Update()
    {
        livesText.text = PlayerStats.Lives.ToString() + "LIVES";
    }
}
Daniel Felipe Cadavid Duque
POO #2

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

Re: Waterman - Cydia Games

Post by xacarana » Fri Apr 12, 2019 10:35 am

Image

Pendiente el avance
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

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

Re: Waterman - Cydia Games

Post by KevinAlejandro » Fri Apr 12, 2019 11:29 pm

Daily

Viernes, 12 de Abril.

¿Qué hemos hecho?
  • Hemos actualizado los scripts del proyecto en función de cohesión. Idea dada como sugerencia del profesor.
  • Se finalizo la programación acerca de conteo de vidas del jugador.
¿Qué haremos?
  • Se corregirán errores causados por el nuevo script implementados mediante conocimientos previos y la ayuda de foros acerca de Unity.
  • Se implementará una nueva función para el enemigo el cual se trata de vida para el enemigo y daño de la bala hacia el enemigo, pero dentro de los mismos scripts ya previamente implementados.
¿Qué dificultades han tenido?
  • No hemos tenido errores.
Scripts usados

Bullet

Code: Select all

using UnityEngine;

public class Bullet : MonoBehaviour
{
    /*
     * Creo la variable target que es el objetivo que seguira la bala y la velocidad que tendra la bala y como es publica, se puede modificar en el inspector de Unity. 
     */
    private Transform target;

    private float speed;
    private int damage;

    private void Start()
    {
        speed = 5f;
        damage = 25;
    }
    /*
     * Este metodo es para poder pasarle el target del script Torre a este para no tener que crear la funcionalidad de buscar el objetivo en dos scripts pudiendo pasarla a este script de esta manera. 
     */
    public void Seek(Transform _target)
    {
        /*
         * Llamamos esta funcion en el script Torre y le pasamos el target que es un Transform y aqui lo llamamos _target y se lo pasamos aqui a nuestro nuevo target O.G. 
         */
        target = _target;
    }
    void Update()
    {
        /*
         * Si no hay un objetivo, se destruira la bala. 
         */
        if(target == null)
        {
            Destroy(gameObject);
            return;
        }

        /*
         * El Vector3 dir es para conocer la direccion que tendra la bala. 
         * float distanceThisFrame es para calcular la distancia con los fotogramas (frames) del juego.
         * Si es menor el dir del distanceThisFrame entonces la bala habra impactado el objetivo.
         */
        Vector3 dir = target.position - transform.position;
        float distanceThisFrame = speed * Time.deltaTime;

        if(dir.magnitude <= distanceThisFrame)
        {
            // Se llama el metodo HitTarget que sera, por ahora, para destruir el enemigo y no bajarle vida.
            HitTarget();
            return;
        }

        // Esto es para que cada maquina que corra el juego, funcione correctamente y no vaya mejor a unos que a otros, sino que este sirviendo por igual a todos.
        transform.Translate(dir.normalized * distanceThisFrame, Space.World);
    }

    /*
     * La funcion que destruye el enemigo apenas entre en contacto. 
     */
    void HitTarget()
    {
        Destroy(target.gameObject);
        return;
    }

    void Damage(Transform enemigo)
    {
        Enemigo e = enemigo.GetComponent<Enemigo>();

        if (e != null)
        {
            e.TakeDamage(damage);
        }
    }
}

Enemigo

Code: Select all

using UnityEngine;

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 Transform objetivo;
    private int wavePointIndex;
    private float velocidad;
    private float health;

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

    public void TakeDamage(int amount)
    {
        health -= amount;
        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 >= Waypoints.nodos.Length - 1)
        {
            EndPath();
            return;
        }

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

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

}

LiveUI

Code: Select all

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

public class LiveUI : MonoBehaviour
{
    public Text livesText;

    void Update()
    {
        livesText.text = PlayerStats.Lives.ToString() + " Vidas";
    }
}

GameManager

Code: Select all

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

public class GameManager : MonoBehaviour
{
    private bool gameEnded = false;

    void Update()
    {
        if (gameEnded)
        
            return;
        
        if (PlayerStats.Lives <= 0)
        {
            EndGame();
        }
    }

    void EndGame()
    {
        gameEnded = true;
        Debug.Log("Game Over!");
    }

}

PlayerStats

Code: Select all

using UnityEngine;

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

    void Start()
    {
        startLives = 6;
        Lives = startLives;
    }
}
Evidencias

Vida del jugador en la parte inferior izquierda.

Image


Vida del jugador disminuida y Scripts en uso.

Image


Nota: En el transcurso de la semana se crearán los videos mostrando la funcionalidad de cada script.
Kevin Alejandro Vasco Hurtado
PDOO #2

Post Reply