Comedores de Mana / HIKARI entertainment

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

Moderator: julianmartinez16

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 » Wed Mar 20, 2019 7:14 pm

Qué hemos hecho?
Hemos programado el juego, donde hemos avanzado en: Enemigos que salen, tratan de llega a un objetivo con vida, le hacen daño al objetivo, reciben daño y mueren.

Qué vamos a hacer?
Éste fin de semana nos vamos a reunir a seguir adelantando el juego. Por ahora consideramos que ya hemos hecho todo lo básico del juego

Qué dificultades tuvimos?
Los trabajos de otras materias y horarios semanales impiden, en parte, que coincidan los horarios libres entre los 3, pero siempre sacamos un pequeño espacio para adelantar, ya sea en la U o por Skype
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 » Sat Mar 23, 2019 1:01 pm

Qué hemos hecho?
Esta semana trabajamos en las animaciones del personaje principal y el golem

Qué vamos a hacer?
Vamos a seguir trabajando en las animaciones faltantes (PersonajePrincipal Ataque, Golem Ataque, Golem Runcycle, Arquero Ataque, Arquero Runcycle y Arquero Idle)

Qué problemas tuvimos?
El timming de las animaciones, cómo son animaciones para videojuegos tienen que ser muy rápidas y esto dificulta su creación ya que son muy pocos frames para lograr un movimiento fluido

Image
PersonajePrincipal Idle

Image
PersonajePrincipal RunCycle

Image
Golem Idle
Xti

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 » Thu Mar 28, 2019 8:21 pm

Qué hemos hecho?
Hasta ahora hemos adelantado cada ves más el juego. Empezamos a hacer las diapositivas para exponer la preentrega la otra semana

Qué vamos a hacer?
Vamos a pulir más el juego. Por ahora tenemos todo lo básico más los sprytes

Qué problemas tuvimos?
No hemos podido reunirnos para planear bien la exposición. Lo dejaremos para el fin de semana y organizar bien qué vamos a dar a conocer al grupo
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 » Sat Mar 30, 2019 10:58 pm

Qué hemos hecho?
Seguimos adelantando el juego. Hicimos las diapositivas en power point sobre la preentrega la otra semana

Qué vamos a hacer?
Vamos a pulir algunos detalles del juego para la preentrega. También convertiremos las diapositivas de Power Point a SlideShare

Qué problemas tuvimos?
Hasta ahora no hemos tenido ningún inconveniente. Todo nos ha salido bien hasta ahora
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 » Tue Apr 02, 2019 12:16 pm

Xti

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 Apr 02, 2019 3:32 pm

UBICAR TORRETAS

Code: Select all

 
 public class UbicarTorretas : MonoBehaviour
{

    public GameObject TorretasDefensivasPrefab;
    private GameObject TorretasDefensivas;

    private bool CanPlaceTorretasDefensivas()
    {
    	return TorretasDefensivas == null; 
    }
	    //1
	void OnMouseUp() //PROCESO EN EL QUE SI SE HACE CLICK EN EL BOX COLLIDER QUE POSEE LA "X", APARECERÁ UNA DEFENSA
	{
	  //2
	  if (CanPlaceTorretasDefensivas())
	  {
	    //3
	    TorretasDefensivas = (GameObject) 
	      Instantiate(TorretasDefensivasPrefab, transform.position, Quaternion.identity); //MÉTODO PARA QUE APAREZCAN LAS DEFENSAS UNA VEZ SE HACE CLICK SOBRE LAS "X"
	    
	  }
	}
}
    
MOVIMIENTO ENEMIGO

Code: Select all

public class MoveEnemy : MonoBehaviour
{

	//VARIABLES
	[HideInInspector]
	public GameObject[] waypoints; //UN ARRAY QUE TOMA LOS PUNTOS A RECORRER PARA EL ENEMIGO
	private int currentWaypoint = 0; //EL PUNTO RECIENTE DESDE DONDE VA A COMENZAR A MOVERSE EL ENEMIGO
	private float lastWaypointSwitchTime;
	public float speed = 1.0f; //VELOCIDAD DEL ENEMIGO

    
    void Start()
    {
    	lastWaypointSwitchTime = Time.time; //INICIALIZAR LA VARIABLE DESDE EL ÚLTIMO PUNTO DEL RECORRIDO DEL ENEMIGO
    	//COMO RECIÉN VA A EMPEZAR SU RECORRIDO, ESTE VALOR SERÁ 0, ES DECIR, DESDE EL PUNTO 0 EMPEZARÁ A CAMINAR   
    }

    
    void Update() //PROCESO DE MOVIMIENTO DEL ENEMIGO SIGUIENDO LOS PUNTOS TRAZADOS EN EL ENTORNO
    {
		    	// 1 
		Vector3 startPosition = waypoints [currentWaypoint].transform.position;
		Vector3 endPosition = waypoints [currentWaypoint + 1].transform.position;
		// 2 
		float pathLength = Vector3.Distance (startPosition, endPosition);
		float totalTimeForPath = pathLength / speed;
		float currentTimeOnPath = Time.time - lastWaypointSwitchTime;
		gameObject.transform.position = Vector2.Lerp (startPosition, endPosition, currentTimeOnPath / totalTimeForPath);
		// 3 
		if (gameObject.transform.position.Equals(endPosition)) 
		{
		  if (currentWaypoint < waypoints.Length - 2)
		  {
		    // 3.a 
		    currentWaypoint++;
		    lastWaypointSwitchTime = Time.time;
		    // TODO: Rotate into move direction
		  }
		  else
		  {
		    // 3.b 
		    Destroy(gameObject); //CUANDO YA LLEGUE AL ÚLTIMO PUNTO DEL RECORRIDO SE DESTRUYE EL ENEMIGO
	    	    
		  }
		}
    }
    public float DistanceToGoal()
	{
	  float distance = 0;
	  distance += Vector2.Distance(
	      gameObject.transform.position, 
	      waypoints [currentWaypoint + 1].transform.position);
	  for (int i = currentWaypoint + 1; i < waypoints.Length - 1; i++)
	  {
	    Vector3 startPosition = waypoints [i].transform.position;
	    Vector3 endPosition = waypoints [i + 1].transform.position;
	    distance += Vector2.Distance(startPosition, endPosition);
	  }
	  return distance;
	}
}


TIEMPOENEMIGO

Code: Select all


public class SpawnEnemy : MonoBehaviour
{
	public GameObject[] waypoints; //PUNTOS DE RECORRIDO QUE VA A SEGUIR LOS ENEMIGOS PARA LLEGAR A LA BASE
	public GameObject testEnemyPrefwaypoints;

	[System.Serializable]
	public class Wave
	{
	  public GameObject enemyPrefab; //TOMA EL PREFAB DEL ENEMIGO QUE SE VA A DESPLAZAR
	  public float spawnInterval = 2;
	  public int maxEnemies = 20;
	}

	public Wave[] waves; //PREFABS DE LAS OLEADAS, YA QUE CADA OLEADA PUEDE SER UN ENEMIGO DIFERENTE, YA SEA EN ESTÉTICA O EN DAÑO
	public int timeBetweenWaves = 5;

	private GameManagerBehavior gameManager;

	private float lastSpawnTime; //VARIABLE PARA TOMAR EL TIEMPO QUE LE TOMA A LAS OLEADAS APARECER EN EL ENTORNO
	private int enemiesSpawned = 0;


    // Start is called before the first frame update
    void Start()
    {
        lastSpawnTime = Time.time;
		gameManager =
		    GameObject.Find("GameManager").GetComponent<GameManagerBehavior>();

    }

    // Update is called once per frame
    void Update() //PROCEDIMIENTO PARA EL DESPLAZAMIENTO DE LOS ENEMIGOS, LA CANTIDAD DE LA OLEADA Y DE A CUANTOS SEGUNDOS APARECERÁ CADA ENEMIGO DE LA OLEADA
    {
		        // 1
		int currentWave = gameManager.Wave;
		if (currentWave < waves.Length)
		{
		  // 2
		  float timeInterval = Time.time - lastSpawnTime;
		  float spawnInterval = waves[currentWave].spawnInterval;
		  if (((enemiesSpawned == 0 && timeInterval > timeBetweenWaves) ||
		       timeInterval > spawnInterval) && 
		      enemiesSpawned < waves[currentWave].maxEnemies)
		  {
		    // 3  
		    lastSpawnTime = Time.time;
		    GameObject newEnemy = (GameObject)
		        Instantiate(waves[currentWave].enemyPrefab);
		    newEnemy.GetComponent<MoveEnemy>().waypoints = waypoints;
		    enemiesSpawned++;
		  }
		  // 4 
		  if (enemiesSpawned == waves[currentWave].maxEnemies &&
		      GameObject.FindGameObjectWithTag("Enemy") == null)
		  {
		    gameManager.Wave++;
		    enemiesSpawned = 0;
		    lastSpawnTime = Time.time;
		  }
		  // 5 
		}
		else
		{
		  gameManager.gameOver = true; //PROCEDIMIENTO PARA EL "GAME OVER" DEL JUEGO (EN PROCESO...)
		  GameObject gameOverText = GameObject.FindGameObjectWithTag ("GameWon");
		  gameOverText.GetComponent<Animator>().SetBool("gameOver", true);
		}

    }


}


Last edited by danhercha on Tue Apr 23, 2019 11:06 pm, edited 1 time 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 Apr 05, 2019 10:32 am

¡Qué hemos hecho?
Hemos Corregido la presentación de la preentrega.

¿Que vamos a hacer?
Se va a hacer un adelanto del videojuego:
-El día de hoy vamos a hacer que se mejore la salida de los enemigos, para que no salgan dispersos
-Se van a organizar las torres.
-Se van a organizar los aliados
-Que el cristal tenga vida

¿Qué dificultades hemos tenido?
Ésta semana se nos hizo difícil reunirnos en grupo.
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 Apr 05, 2019 10:44 am

Last edited by danhercha on Fri May 24, 2019 10:17 am, edited 1 time in total.
Daniela Hernández Chavarro

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

Re: Comedores de Mana / HIKARI entertainment

Post by xacarana » Fri Apr 05, 2019 10:45 am

Image

Faltan las evidencias y faltan las fotos y las firmas.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
sebastianjc
Posts: 5
Joined: Tue Jan 29, 2019 2:21 pm

Re: Comedores de Mana / HIKARI entertainment

Post by sebastianjc » Tue Apr 09, 2019 11:21 am

¿Qué hemos hecho?

  • hemos logrado que os enemigos aparezcan en un orden aleatorio .
  • hemos garantizado que su movimiento sea aleatorio y que siga el camino que deseamos
  • logramos que los enemigos aparezcan no uno de tras de otro ( en fila) sino en forma desordenada
  • uno de los caminos ( nuestro juego consta de 3 caminos por donde llegan los enemigos ) es funcional la oleadas aparecen de forma correcta
  • el cristal ( el objeto a defender ) posee vida
  • los enemigos generan daño
  • el cristal recibe daño
  • manejo de la velocidad de movimiento de los enemigos


¿Que vamos a hacer?
Se va a hacer un adelanto del vídeo juego:
  • buscaremos que las torres ya puedan generar aliados
  • se buscara poder programar un héroe
  • Se buscara que los aliados tenga vida y generen daño con los enemigos
¿Qué dificultades hemos tenido?
no tenemos bien en claro el diseño de las torres ( parte gráfica que el usuario interactuara )





evidencia

código cristal

codificado por : Sebastian Jaramillo Cano

Code: Select all

public class Cristal : MonoBehaviour {

    public int vida;
    public GameObject gameOver;
    public bool fin;

	void Start () {
        gameOver.SetActive(false);
        vida = 1000;
	}
	
	void Update () {

        if (vida <= 0)
        {
            gameOver.SetActive(true);
            fin = true;
        }

        if (fin && Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
        }
	}
}

enemigos

codificado por : Sebastian Jaramillo Cano

Code: Select all

public class Enemigo : MonoBehaviour {

    public float speed;
    public int vida;
    public int daño;

    public int ubicacion;
    public GameObject[] waypoints;
    public GameObject cristal;

    public bool atancando;

	void Start () {

        vida = 100;
        
        waypoints = new GameObject[GameObject.FindGameObjectsWithTag("WayPoints").Length];

        foreach (GameObject way in GameObject.FindGameObjectsWithTag("WayPoints"))
        {
            waypoints[int.Parse(way.name)] = way;
        }

        cristal = GameObject.Find("Cristal");

        StartCoroutine(Daño());
    }
	
	void Update () {

        transform.position += (waypoints[ubicacion].transform.position - transform.position).normalized * Time.deltaTime * speed;
        if ((waypoints[ubicacion].transform.position - transform.position).magnitude < 1)
        {
            if (ubicacion < waypoints.Length - 1) ubicacion++;
            
        }

        if ((cristal.transform.position - transform.position).magnitude < 1)
        {
            atancando = true;
        }
        else
        {
            atancando = false;
        }

        if (vida <= 0) Destroy(gameObject);
	}

    IEnumerator Daño()
    {
        yield return new WaitForSeconds(1);
        if (atancando) cristal.GetComponent<Cristal>().vida -= daño;
        StartCoroutine(Daño());
    }
}
controlador de los enemigos

codificado por : Sebastian Jaramillo Cano

Code: Select all

public class ControlEnemigo : MonoBehaviour {

    public GameObject enemigo;

	void Start () {
        StartCoroutine(ControlOleadas());
	}
	
	void Update () {

        

	}

    IEnumerator Oleada(float tiempoDiferencia, int cantidadEnemigos)
    {
        for (int i = 0; i < cantidadEnemigos; i++)
        {
            Instantiate(enemigo, transform.position + Vector3.up * Random.Range(-1f,1f), transform.rotation);
            yield return new WaitForSeconds(tiempoDiferencia);
        }

    }

    IEnumerator ControlOleadas()
    {
        //Oleada 1
        StartCoroutine(Oleada(5, 5));
        yield return new WaitForSeconds(25);

        yield return new WaitForSeconds(5);
        //Oleada 2
        StartCoroutine(Oleada(4, 7));
        yield return new WaitForSeconds(25);

        yield return new WaitForSeconds(5);
        //Oleada 3
        StartCoroutine(Oleada(4, 10));
        yield return new WaitForSeconds(25);

        yield return new WaitForSeconds(5);
        //Oleada 4
        StartCoroutine(Oleada(3, 20));
        yield return new WaitForSeconds(25);

        yield return new WaitForSeconds(5);

        //Oleada 5
        StartCoroutine(Oleada(2, 20));
        yield return new WaitForSeconds(25);

        yield return new WaitForSeconds(5);

    }


}
Last edited by sebastianjc on Fri Apr 12, 2019 12:14 am, edited 5 times in total.
sebastian jaramillo cano 8-)

Post Reply