SlideShare una empresa de Scribd logo
1 de 64
Pre-entrega Programación
Orientada a objetos
- Jhon Mayuza
- Daniela Atencia
Backlog
Actividad Semana Esfuerzo
x Definir historia, lluvia de ideas Semana 1 3
x Definir nombre y logo de la empresa Semana 1 2
x Definir nombre y logo del juego Semana 1 2
x Diseño de personajes y escenarios Semana 2 4
x Definir mecánicas e iniciar programación de
enemigos
Semana 2 4
x Ilustraciones de torres Semana 3 3
x Ilustración de efectos Semana 4 3
x Ilustración de enemigos Semana 5 3
Backlog
Actividad Semana Esfuerzo
x Ilustración escenarios Semana 6 2
x Animación enemigos Semana 7 3
x Pantallas game over y victoria Semana 8 4
x Movimiento de oleadas Semana 7 4
x Posicionamiento de torres Semana 9 4
x Disparos Semana 9 4
x Pantalla de inicio (menú) Semana 7 3
x Daño Semana 11 3
x Aumento de dificultad Semana 12 4
Backlog
Actividad Semana Esfuerzo
x Sistema de puntos Semana 12 3
x Audio, fx Semana 13 4
x Primeras pruebas Semana 14 3
x Correcciones finales Semana 15 3
Pruebas finales Semana 17 4
Semana 1
-Crear grupo.
-Iniciar backlog.
-Crear nombre del juego y nombre del
estudio.
-Definir algunas mecánicas del juego.
-Lluvia de ideas.
-Contexto y narrativa del juego.
-Concepto y primeros bocetos de los
Personajes (incompleto).
-Boceto de mecánica.
-Búsqueda de Referencias.
Primer diseño logo del equipo
Update logo del estudio
Logo del juego
Update #2 logo del estudio
Referencias
kingdom rush
Referencias
Dragon’s awaken
Contexto
En el reino de Fardia, Drak, un imponente, colosal y temido dragón, ha caído víctima
de una nefasta maldición, y a pesar que esta no sea lo suficientemente poderosa para
acabar con su vida, lo ha dejado debilitado, noticia que se esparce como el fuego
alrededor de todas las comarcas.
Mercenarios, clanes guerreros, cazarrecompensas, caballeros e incluso saqueadores,
todos se preparan para sacar provecho de la vulnerabilidad del dragón, ya sea para
echar mano de su cabeza, o su tesoro.
Ante la inminente llegada de ejércitos enteros, dispuestos a todo para saciar su codicia
humana, el dragón deberá, con ayuda de otras bestias y enemigos de los avariciosos
humanos, proteger su santuario y a si mismo.
Escenario
Drak, ahora resguardado en su santuario, dentro de lo más profundo de una cueva en
las montañas de Fardia, se prepara para defenderse de la arremetida humana con toda
la fuerza que aún le queda, para su suerte, múltiples grupos de criaturas de la montaña
se ofrecen a ayudarle.
Resguardado tras sistemas de cuevas construidos por el mismo, deberá planear una
estrategia para resistir la arremetida humana hasta que haya recobrado sus fuerzas.
Semana 2
-Narrativa.
-Personajes y sus funciones.
-Empezar bocetos de personajes.
-Cambio de nombre de la empresa y
de nombre de juego.
-Ver vídeos de referencia.
-empezar bocetos de torres.
-empezar oleadas de enemigos.
Unidades (Aliadas)
Criaturas, bestias y monstruos de los bosques, acudiendo a la batalla ya sea por la
defensa del dragón, o simplemente por la oportunidad de matar humanos.
Torres
Puestos establecidos estratégicamente por el dragón para ubicar grupos de aliados, con
el fin de tener ventaja sobre el atacante. Se dividen en dos categorías, a Distancia y
Cuerpo a Cuerpo.
Torres a Distancia
Puestos ubicados para atacar al enemigo desde lejos, ubicados principalmente para dar
apoyo a las torres cuerpo a cuerpo.
Se tendrá a disposición de dos torres de este tipo: Duendes y Ogros
Duendes
A pesar de su poca fuerza, la velocidad
de esta torre compensa, ya que permite
alcanzar a los adversarios más rápidos.
Pros: Alta Precisión, Disparos Rápidos,
Sangrado en enemigos.
Contras: Daño Bajo, Débil ante grupos
grandes de enemigos.
Ogros
Su fuerza e inmenso daño pueden
verse opacados por su lentitud e
imprecisión al disparar.
Pros: Daño de área, capaz de dañar
múltiples enemigos.
Contras: Poca Precisión, Velocidad
de lanzamiento lenta..
Torres Cuerpo a Cuerpo
Unidades de choque que frenan el avance del enemigo.
Unidad Principal: Nigromante: Conjurador y practicante de las artes oscuras, capaz de
invocar múltiples aliados en el combate.
Las unidades de cuerpo a cuerpo disponibles son, el Espíritu Oscuro, el Esqueleto, y el
Defensor Despertado.
Espíritu Oscuro
Débil y lento al atacar, es la unidad
más básica y barata de cuerpo a
cuerpo.
Pros: Fácil y rápida obtención,
abundante.
Contras: Daño y Salud Mediocres.
Esqueleto
A pesar de su extremadamente baja
salud, es capaz de causar estragos en los
enemigos con su daño alto.
Pros: Daño Excelente.
Contras: Salud Baja.
Defensor
DespertadoNo tiene mucha fuerza, pero su resistencia
alta le permite contener a grupos grandes de
enemigos por más tiempo.
Pros: Salud Excelente, puede frenar múltiples
enemigos.
Contras: Daño Mediocre, escasos.
Unidades (Enemigas)
Humanos invadiendo la guarida de Drak, su codicia y sed de sangre les impulsa a
través de las adversidades.
Entre ellos podemos encontrar: Campesinos, Caballeros, Sacerdotes, Piqueros,
Saqueadores, Ladrones, y el rival definitivo del dragón, el Héroe.
Campesino
La unidad más básica y abundante
de los invasores durante las primeras
rondas.
Pros: Cantidad.
Contras: Salud, Daño y Velocidad
mediocres.
Caballero
Ligeramente más fuerte que su
predecesor, pero todavía demasiado débil
como para ser una amenaza por sí solo.
Pros: Armadura (Alta resistencia contra
ataques a distancia).
Contras: Salud mediocre, Daño y
Velocidad promedio.
Sacerdote
Unidad capaz de curar a sus aliados cuando
están a corta distancia.
Pro: Curar Unidades Cercanas.
Contras: Velocidad y Salud promedio, daño
mediocre, no puede usar sus poderes en sí
mismo.
Piquero
Extremadamente Lento, pero se abre
paso a través de oponentes cuerpo a
cuerpo sin esfuerzo alguno.
Pros: Extremadamente Peligrosos a
corta distancia.
Contras: Velocidad Pésima.
Saqueador
Unidad inmune a los ataques a distancia.
Pros: INMUNE a ataques a distancia,
Salud y daño altos.
Contras: Velocidad baja.
Ladrón
Unidad rápida e inmune a los ataques
cuerpo a cuerpo.
Pros: INMUNE a ataques cuerpo a cuerpo,
velocidad Excelente.
Contras: Salud mediocre, vulnerable a
torres básicas por la rapidez de estas.
Héroe
Enemigo más fuerte y jefe durante la última oleada, potencia unidades cercanas y
su llegada al final del camino causa la derrota inmediata
Pros: Daño y Salud Extremos, potencia unidades cercanas, su llegada al santuario
causara la derrota inmediata.
Contras: Velocidad baja.
Semana 3
- Definir caminos, aún sin digitalizar.
- Definir torres, ya digitalizadas.
- Avances en la programación respecto a las oleadas y el shooting.
-Primeros bocetos de cómo irían los caminos.
-Mejoras de torres.
-Intentar oleadas.
Estos son modelos de torres
usadas y a implementar
Semana 4
-Animaciones de explosiones.
-Programación de la torre, aun sin funcionar bien.
- Pruebas de programación en torres y enemigos.
- Estudio del sistema de oleadas.
- Programación del movimiento de unidades mediante waypoints.
Ejemplos de animaciones a
implementar
Semana 5
-Código de creación de torres.
-Código de daño (con errores)
Semana 5. Código de spawn de balas
Semana 6
-Código de Bullet.
- Código de Bullet Spawner.
- Código de movimiento de enemigos. (en progreso)
- Código de torre (Spawn de proyectiles)
-menú
Semana 6, código de enemigo
Semana 7
-código y correcciones.
-reciclar las unidades para que no crearan una sobrecarga en la memoria.
-Código de salud (para daño de personajes)
Semana 7, código de salud
Semana 8
-Prueba de funcionalidad de las oleadas (que siguieran el camino)
-Prueba de funcionalidad de los disparos.
Semana 8, código de bala
Semana 9
-Nueva ruta.
-Vídeos y compresión del código.
-Preparación para la pre entrega.
Semana 9, código de ruta
Semana 10
-Prueba de menú y seguimiento de camino.
-Mejora del seguimiento.
-Preparación para la pre entrega.
Semana 10, clase spawn de bala
Semana 10, clase oleada
Semana 10, clase enemigo
Semana 10, clase salud
Semana 10, clase Bala
Semana 10, clase menú
Códigos implementados en
el momento:
Enemigo
public class Enemigo: MonoBehaviour
{
public float velocidad;
private Waypoints wpoints; // Permite asignarle los Waypoints respectivos del camino a recorrer.
private Vector3 posicion_inicial; // Guarda su posición de inicio.
private int contador; // Necesario para el funcionamiento del movimiento.
void Start()
{
posicion_inicial = this.transform.position; // Establece la posición actual.
wpoints = GameObject.FindGameObjectWithTag("Waypoints").GetComponent<Waypoints>(); //Detecta todos los Waypoints que
pertenecen a una ruta.
}
void Update()
{
transform.position = Vector3.MoveTowards(transform.position, wpoints.waypoints[contador].position, velocidad * Time.deltaTime); //
Le da movimiento a la unidad a través del camino.
if(Vector3.Distance(transform.position, wpoints.waypoints[contador].position) < 0.1f)
{
contador++; //Cuando se encuentra extremadamente cerca de su objetivo, el contador aumenta, haciendo que cambie su rumbo al
próximo waypoint.
}
if (GameObject.FindGameObjectsWithTag("WP1").Length == contador)
{
contador = 0;
this.transform.position = posicion_inicial ; //Regresa a la unidad a su posición de inicio y reinicia su contador.
}
//test muerte
if (GetComponent<Salud>().salud < 0) { velocidad = 0; } // Inmoviliza a la unidad, será reemplazado en el futuro por una animación
de muerte.
//fin de test muerte
}
void OnTriggerEnter(Collider otro)
{
if (otro.gameObject.tag == "Bala")
{
Destroy(otro.gameObject); // Destruye las balas cuando es impactado por ellas.
}
}
}
Bala
public class Bala : MonoBehaviour
{
private GameObject objetivo; // El objeto al que la bala se dirigira, asignado por la torre.
private float velocidad = 5; // La rapidez de la bala.
void Update()
{
Vector3 direccion; // Le indica la dirección de su objetivo.
if (objetivo != null) // Mantiene la bala activa mientras su objetivo lo esté.
{
direccion = objetivo.transform.position - this.transform.position; // Mueve la bala hacia su objetivo.
this.transform.position += velocidad * direccion * Time.deltaTime; // Maneja la velocidad de la bala.
}
}
public void ActivarBala(Torre torre)
{
objetivo = torre.Enemigo; // Usado por la torre para asignar un objetivo a la bala.
}
}
Pooling Enemigos
public class PoolingEnemigos : MonoBehaviour
{
public static ArrayList unidades = new ArrayList(); // Arreglo de enemigos
void Start()
{
GameObject unidad = GameObject.Find("Test Enemigo"); //Busca el enemigo a asignar.
GameObject temp; // Guarda la unidad que permitirá la aparición de las demás.
Vector3 incremento = new Vector3(-2, 0); // Establece la distancia a la que cada copia aparecerá.
Vector3 posicion_actual = unidad.transform.position; // Guarda la posición del original.
for(int i = 0; i < 10; i++) // Establece i como la cantidad de enemigos a aparecer.
{
temp = (GameObject)Instantiate(unidad,posicion_actual + incremento,Quaternion.identity); // Hace aparecer a las copias del
enemigo.
posicion_actual = temp.transform.position; // Actualiza la posición de la última copia generada.
unidades.Add(temp); // Agrega las unidades creadas al arreglo.
}
}
}
Waypoints
public class Waypoints : MonoBehaviour
{
public Transform[] waypoints; // Funciona como un array que permite modificar las rutas fácilmente desde el editor.
}
Torre
public class Torre : MonoBehaviour
{
private GameObject enemigo; // Guarda el objetivo actual de la torre.
private bool esta_activa; // Maneja el estado de la torre.
private float distancia_umbral = 10f; // Es la distancia a la que un enemigo debe estar para que la torre se active.
public float retraso_disparo = 0f; // Usado para controlar la cadencia de disparo de la torre.
void Update()
{
retraso_disparo -= Time.deltaTime; // Reduce el contador para permitir un próximo disparo.
Enemigo = BuscarEnemigoCercano();
if (Enemigo != null && retraso_disparo <= 0)
{
Disparar(); // Sólo dispara si hay enemigos en su rango y si el enfriamiento de su último disparo ha pasado.
}
}
void Disparar()
{
GameObject obj = (GameObject)Instantiate(GameObject.Find("Bala"), this.transform.position, Quaternion.identity); // Permite acceso
al Prefab de Bala del editor.
Bala bala = obj.GetComponent<Bala>(); //Da acceso al código de la bala.
bala.ActivarBala(this); // Activa la bala.
retraso_disparo = 0.3f; //Reactiva el contador, causando un tiempo de espera para el próximo disparo.
}
GameObject BuscarEnemigoCercano()
{
ArrayList enemigos = PoolingEnemigos.unidades; // Detecta al grupo de enemigos, se sospecha genera problemas para detectar al
primero y al ultimo.
GameObject temp; // Crea un espacio temporal para guardar el objetivo.
foreach (object item in enemigos)
{
temp = (GameObject)item; // Rastrea específicamente los enemigos pertenecientes al arreglo, probablemente cree inconvenientes
al agregar mas variantes de enemigo.
if (Vector3.Distance(temp.transform.position, this.transform.position) < distancia_umbral && temp.GetComponent<Salud>().salud >
0)
{
return temp; // Detecta al enemigo en el rango de la torre, y evita detectar enemigos que ya hayan sido derrotados.
}
}
return null; // Si no encuentra enemigos, no regresará nada, haciendo que la torre tampoco haga nada.
}
public GameObject Enemigo
{
get => enemigo; set => enemigo = value;
}
public bool Esta_activa
{
get => esta_activa; set => esta_activa = value;
}
}
Salud
public class Salud : MonoBehaviour
{
public int salud = 20; // Establece la salud de la unidad.
public float retraso_muerte = 5f; // Genera un retraso antes de la desaparición de la unidad, actualmente sin ser usado, será
reemplazado por la animación de muerte.
void OnTriggerEnter(Collider collider)
{
if (collider.gameObject.CompareTag("Bala"))
{
salud -= 2; // Reduce la vida de la unidad al ser impactado por una bala.
}
}
void Update()
{
if (salud <= 0)
{
retraso_muerte -= Time.deltaTime; // Activa el contador de muerte, será empleado por la animación de muerte.
}
if (retraso_muerte <= 0)
{
//Destroy(this.gameObject); Intento de desaparición de las unidades derrotadas, genera errores, desactivado hasta encontrar una
solución o alternativa.
}
}
}
Video
Repositorio
https://github.com/danielaatencia/PDOO

Más contenido relacionado

Más de DanielaAtencia (7)

Final Tower Defense
Final Tower DefenseFinal Tower Defense
Final Tower Defense
 
Entrega final - PDOO - Tower defense
Entrega final - PDOO - Tower defenseEntrega final - PDOO - Tower defense
Entrega final - PDOO - Tower defense
 
Backlog - PDOO
Backlog - PDOO Backlog - PDOO
Backlog - PDOO
 
Narrativa y personajes (incompleto)
Narrativa y personajes (incompleto)Narrativa y personajes (incompleto)
Narrativa y personajes (incompleto)
 
History tower
History towerHistory tower
History tower
 
Pitch
PitchPitch
Pitch
 
Pitch
PitchPitch
Pitch
 

Último

Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdf
Yanitza28
 
microsoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamtemicrosoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamte
2024020140
 
Chat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaChat GPT para la educación Latinoamerica
Chat GPT para la educación Latinoamerica
EdwinGarca59
 

Último (20)

Introduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptxIntroduccion-a-la-electronica-industrial.pptx
Introduccion-a-la-electronica-industrial.pptx
 
Editorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdfEditorial. Grupo de 12B de La Salle Margarita.pdf
Editorial. Grupo de 12B de La Salle Margarita.pdf
 
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptxTipos de Datos de Microsoft Access-JOEL GARCIA.pptx
Tipos de Datos de Microsoft Access-JOEL GARCIA.pptx
 
presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...presentación del desensamble y ensamble del equipo de computo en base a las n...
presentación del desensamble y ensamble del equipo de computo en base a las n...
 
microsoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamtemicrosoft word manuales para todos tipos de estudiamte
microsoft word manuales para todos tipos de estudiamte
 
Chat GPT para la educación Latinoamerica
Chat GPT para la educación LatinoamericaChat GPT para la educación Latinoamerica
Chat GPT para la educación Latinoamerica
 
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptxTarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
Tarea_sesion_15_Reportes Maestro - Detalle con el uso de AJAX.pptx
 
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdfRedes Neuronales profundas convolucionales CNN ́s-1.pdf
Redes Neuronales profundas convolucionales CNN ́s-1.pdf
 
Función del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacionFunción del analizador léxico.pdf presentacion
Función del analizador léxico.pdf presentacion
 
10°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-810°8 - Avances tecnologicos del siglo XXI 10-8
10°8 - Avances tecnologicos del siglo XXI 10-8
 
De Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptxDe Olmos Santiago_Dolores _ M1S3AI6.pptx
De Olmos Santiago_Dolores _ M1S3AI6.pptx
 
Editorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdfEditorial. Grupo de 12B. La Salle Margarita.pdf
Editorial. Grupo de 12B. La Salle Margarita.pdf
 
Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.Actividad 6/Las TIC en la Vida Cotidiana.
Actividad 6/Las TIC en la Vida Cotidiana.
 
BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).BUSCADORES DE INTERNET (Universidad de Sonora).
BUSCADORES DE INTERNET (Universidad de Sonora).
 
Tipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de DatosTipos de datos en Microsoft Access de Base de Datos
Tipos de datos en Microsoft Access de Base de Datos
 
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
PRÁCTICA Nº 4: “Análisis de secuencias del ADN con el software BioEdit y uso ...
 
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdfpresentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
presentacion_desamblado_de_una_computadora_base_a_las_normas_de_seguridad.pdf
 
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la ComunicaciónNavegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
Navegadores de internet - Nuevas Tecnologías de la Información y la Comunicación
 
Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024Ejercicio 1 periodo 2 de Tecnología 2024
Ejercicio 1 periodo 2 de Tecnología 2024
 
herramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el temaherramientas web para estudiantes interesados en el tema
herramientas web para estudiantes interesados en el tema
 

Pre entrega PDOO

  • 1. Pre-entrega Programación Orientada a objetos - Jhon Mayuza - Daniela Atencia
  • 2. Backlog Actividad Semana Esfuerzo x Definir historia, lluvia de ideas Semana 1 3 x Definir nombre y logo de la empresa Semana 1 2 x Definir nombre y logo del juego Semana 1 2 x Diseño de personajes y escenarios Semana 2 4 x Definir mecánicas e iniciar programación de enemigos Semana 2 4 x Ilustraciones de torres Semana 3 3 x Ilustración de efectos Semana 4 3 x Ilustración de enemigos Semana 5 3
  • 3. Backlog Actividad Semana Esfuerzo x Ilustración escenarios Semana 6 2 x Animación enemigos Semana 7 3 x Pantallas game over y victoria Semana 8 4 x Movimiento de oleadas Semana 7 4 x Posicionamiento de torres Semana 9 4 x Disparos Semana 9 4 x Pantalla de inicio (menú) Semana 7 3 x Daño Semana 11 3 x Aumento de dificultad Semana 12 4
  • 4. Backlog Actividad Semana Esfuerzo x Sistema de puntos Semana 12 3 x Audio, fx Semana 13 4 x Primeras pruebas Semana 14 3 x Correcciones finales Semana 15 3 Pruebas finales Semana 17 4
  • 5. Semana 1 -Crear grupo. -Iniciar backlog. -Crear nombre del juego y nombre del estudio. -Definir algunas mecánicas del juego. -Lluvia de ideas. -Contexto y narrativa del juego. -Concepto y primeros bocetos de los Personajes (incompleto). -Boceto de mecánica. -Búsqueda de Referencias.
  • 6. Primer diseño logo del equipo
  • 7. Update logo del estudio
  • 9. Update #2 logo del estudio
  • 12. Contexto En el reino de Fardia, Drak, un imponente, colosal y temido dragón, ha caído víctima de una nefasta maldición, y a pesar que esta no sea lo suficientemente poderosa para acabar con su vida, lo ha dejado debilitado, noticia que se esparce como el fuego alrededor de todas las comarcas. Mercenarios, clanes guerreros, cazarrecompensas, caballeros e incluso saqueadores, todos se preparan para sacar provecho de la vulnerabilidad del dragón, ya sea para echar mano de su cabeza, o su tesoro. Ante la inminente llegada de ejércitos enteros, dispuestos a todo para saciar su codicia humana, el dragón deberá, con ayuda de otras bestias y enemigos de los avariciosos humanos, proteger su santuario y a si mismo.
  • 13. Escenario Drak, ahora resguardado en su santuario, dentro de lo más profundo de una cueva en las montañas de Fardia, se prepara para defenderse de la arremetida humana con toda la fuerza que aún le queda, para su suerte, múltiples grupos de criaturas de la montaña se ofrecen a ayudarle. Resguardado tras sistemas de cuevas construidos por el mismo, deberá planear una estrategia para resistir la arremetida humana hasta que haya recobrado sus fuerzas.
  • 14. Semana 2 -Narrativa. -Personajes y sus funciones. -Empezar bocetos de personajes. -Cambio de nombre de la empresa y de nombre de juego. -Ver vídeos de referencia. -empezar bocetos de torres. -empezar oleadas de enemigos.
  • 15. Unidades (Aliadas) Criaturas, bestias y monstruos de los bosques, acudiendo a la batalla ya sea por la defensa del dragón, o simplemente por la oportunidad de matar humanos.
  • 16. Torres Puestos establecidos estratégicamente por el dragón para ubicar grupos de aliados, con el fin de tener ventaja sobre el atacante. Se dividen en dos categorías, a Distancia y Cuerpo a Cuerpo.
  • 17. Torres a Distancia Puestos ubicados para atacar al enemigo desde lejos, ubicados principalmente para dar apoyo a las torres cuerpo a cuerpo. Se tendrá a disposición de dos torres de este tipo: Duendes y Ogros
  • 18. Duendes A pesar de su poca fuerza, la velocidad de esta torre compensa, ya que permite alcanzar a los adversarios más rápidos. Pros: Alta Precisión, Disparos Rápidos, Sangrado en enemigos. Contras: Daño Bajo, Débil ante grupos grandes de enemigos. Ogros Su fuerza e inmenso daño pueden verse opacados por su lentitud e imprecisión al disparar. Pros: Daño de área, capaz de dañar múltiples enemigos. Contras: Poca Precisión, Velocidad de lanzamiento lenta..
  • 19. Torres Cuerpo a Cuerpo Unidades de choque que frenan el avance del enemigo. Unidad Principal: Nigromante: Conjurador y practicante de las artes oscuras, capaz de invocar múltiples aliados en el combate. Las unidades de cuerpo a cuerpo disponibles son, el Espíritu Oscuro, el Esqueleto, y el Defensor Despertado.
  • 20. Espíritu Oscuro Débil y lento al atacar, es la unidad más básica y barata de cuerpo a cuerpo. Pros: Fácil y rápida obtención, abundante. Contras: Daño y Salud Mediocres. Esqueleto A pesar de su extremadamente baja salud, es capaz de causar estragos en los enemigos con su daño alto. Pros: Daño Excelente. Contras: Salud Baja. Defensor DespertadoNo tiene mucha fuerza, pero su resistencia alta le permite contener a grupos grandes de enemigos por más tiempo. Pros: Salud Excelente, puede frenar múltiples enemigos. Contras: Daño Mediocre, escasos.
  • 21. Unidades (Enemigas) Humanos invadiendo la guarida de Drak, su codicia y sed de sangre les impulsa a través de las adversidades. Entre ellos podemos encontrar: Campesinos, Caballeros, Sacerdotes, Piqueros, Saqueadores, Ladrones, y el rival definitivo del dragón, el Héroe.
  • 22. Campesino La unidad más básica y abundante de los invasores durante las primeras rondas. Pros: Cantidad. Contras: Salud, Daño y Velocidad mediocres. Caballero Ligeramente más fuerte que su predecesor, pero todavía demasiado débil como para ser una amenaza por sí solo. Pros: Armadura (Alta resistencia contra ataques a distancia). Contras: Salud mediocre, Daño y Velocidad promedio. Sacerdote Unidad capaz de curar a sus aliados cuando están a corta distancia. Pro: Curar Unidades Cercanas. Contras: Velocidad y Salud promedio, daño mediocre, no puede usar sus poderes en sí mismo.
  • 23. Piquero Extremadamente Lento, pero se abre paso a través de oponentes cuerpo a cuerpo sin esfuerzo alguno. Pros: Extremadamente Peligrosos a corta distancia. Contras: Velocidad Pésima. Saqueador Unidad inmune a los ataques a distancia. Pros: INMUNE a ataques a distancia, Salud y daño altos. Contras: Velocidad baja. Ladrón Unidad rápida e inmune a los ataques cuerpo a cuerpo. Pros: INMUNE a ataques cuerpo a cuerpo, velocidad Excelente. Contras: Salud mediocre, vulnerable a torres básicas por la rapidez de estas.
  • 24. Héroe Enemigo más fuerte y jefe durante la última oleada, potencia unidades cercanas y su llegada al final del camino causa la derrota inmediata Pros: Daño y Salud Extremos, potencia unidades cercanas, su llegada al santuario causara la derrota inmediata. Contras: Velocidad baja.
  • 25. Semana 3 - Definir caminos, aún sin digitalizar. - Definir torres, ya digitalizadas. - Avances en la programación respecto a las oleadas y el shooting. -Primeros bocetos de cómo irían los caminos. -Mejoras de torres. -Intentar oleadas.
  • 26. Estos son modelos de torres usadas y a implementar
  • 27. Semana 4 -Animaciones de explosiones. -Programación de la torre, aun sin funcionar bien. - Pruebas de programación en torres y enemigos. - Estudio del sistema de oleadas. - Programación del movimiento de unidades mediante waypoints.
  • 28. Ejemplos de animaciones a implementar
  • 29. Semana 5 -Código de creación de torres. -Código de daño (con errores)
  • 30. Semana 5. Código de spawn de balas
  • 31. Semana 6 -Código de Bullet. - Código de Bullet Spawner. - Código de movimiento de enemigos. (en progreso) - Código de torre (Spawn de proyectiles) -menú
  • 32. Semana 6, código de enemigo
  • 33. Semana 7 -código y correcciones. -reciclar las unidades para que no crearan una sobrecarga en la memoria. -Código de salud (para daño de personajes)
  • 34. Semana 7, código de salud
  • 35. Semana 8 -Prueba de funcionalidad de las oleadas (que siguieran el camino) -Prueba de funcionalidad de los disparos.
  • 36. Semana 8, código de bala
  • 37. Semana 9 -Nueva ruta. -Vídeos y compresión del código. -Preparación para la pre entrega.
  • 38. Semana 9, código de ruta
  • 39. Semana 10 -Prueba de menú y seguimiento de camino. -Mejora del seguimiento. -Preparación para la pre entrega.
  • 40. Semana 10, clase spawn de bala
  • 42. Semana 10, clase enemigo
  • 48. public class Enemigo: MonoBehaviour { public float velocidad; private Waypoints wpoints; // Permite asignarle los Waypoints respectivos del camino a recorrer. private Vector3 posicion_inicial; // Guarda su posición de inicio. private int contador; // Necesario para el funcionamiento del movimiento. void Start() { posicion_inicial = this.transform.position; // Establece la posición actual. wpoints = GameObject.FindGameObjectWithTag("Waypoints").GetComponent<Waypoints>(); //Detecta todos los Waypoints que pertenecen a una ruta. }
  • 49. void Update() { transform.position = Vector3.MoveTowards(transform.position, wpoints.waypoints[contador].position, velocidad * Time.deltaTime); // Le da movimiento a la unidad a través del camino. if(Vector3.Distance(transform.position, wpoints.waypoints[contador].position) < 0.1f) { contador++; //Cuando se encuentra extremadamente cerca de su objetivo, el contador aumenta, haciendo que cambie su rumbo al próximo waypoint. } if (GameObject.FindGameObjectsWithTag("WP1").Length == contador) { contador = 0; this.transform.position = posicion_inicial ; //Regresa a la unidad a su posición de inicio y reinicia su contador. } //test muerte if (GetComponent<Salud>().salud < 0) { velocidad = 0; } // Inmoviliza a la unidad, será reemplazado en el futuro por una animación de muerte. //fin de test muerte } void OnTriggerEnter(Collider otro) { if (otro.gameObject.tag == "Bala") { Destroy(otro.gameObject); // Destruye las balas cuando es impactado por ellas. } } }
  • 50. Bala
  • 51. public class Bala : MonoBehaviour { private GameObject objetivo; // El objeto al que la bala se dirigira, asignado por la torre. private float velocidad = 5; // La rapidez de la bala. void Update() { Vector3 direccion; // Le indica la dirección de su objetivo. if (objetivo != null) // Mantiene la bala activa mientras su objetivo lo esté. { direccion = objetivo.transform.position - this.transform.position; // Mueve la bala hacia su objetivo. this.transform.position += velocidad * direccion * Time.deltaTime; // Maneja la velocidad de la bala. } } public void ActivarBala(Torre torre) { objetivo = torre.Enemigo; // Usado por la torre para asignar un objetivo a la bala. } }
  • 53. public class PoolingEnemigos : MonoBehaviour { public static ArrayList unidades = new ArrayList(); // Arreglo de enemigos void Start() { GameObject unidad = GameObject.Find("Test Enemigo"); //Busca el enemigo a asignar. GameObject temp; // Guarda la unidad que permitirá la aparición de las demás. Vector3 incremento = new Vector3(-2, 0); // Establece la distancia a la que cada copia aparecerá. Vector3 posicion_actual = unidad.transform.position; // Guarda la posición del original. for(int i = 0; i < 10; i++) // Establece i como la cantidad de enemigos a aparecer. { temp = (GameObject)Instantiate(unidad,posicion_actual + incremento,Quaternion.identity); // Hace aparecer a las copias del enemigo. posicion_actual = temp.transform.position; // Actualiza la posición de la última copia generada. unidades.Add(temp); // Agrega las unidades creadas al arreglo. } } }
  • 55. public class Waypoints : MonoBehaviour { public Transform[] waypoints; // Funciona como un array que permite modificar las rutas fácilmente desde el editor. }
  • 56. Torre
  • 57. public class Torre : MonoBehaviour { private GameObject enemigo; // Guarda el objetivo actual de la torre. private bool esta_activa; // Maneja el estado de la torre. private float distancia_umbral = 10f; // Es la distancia a la que un enemigo debe estar para que la torre se active. public float retraso_disparo = 0f; // Usado para controlar la cadencia de disparo de la torre. void Update() { retraso_disparo -= Time.deltaTime; // Reduce el contador para permitir un próximo disparo. Enemigo = BuscarEnemigoCercano(); if (Enemigo != null && retraso_disparo <= 0) { Disparar(); // Sólo dispara si hay enemigos en su rango y si el enfriamiento de su último disparo ha pasado. } } void Disparar() { GameObject obj = (GameObject)Instantiate(GameObject.Find("Bala"), this.transform.position, Quaternion.identity); // Permite acceso al Prefab de Bala del editor. Bala bala = obj.GetComponent<Bala>(); //Da acceso al código de la bala. bala.ActivarBala(this); // Activa la bala. retraso_disparo = 0.3f; //Reactiva el contador, causando un tiempo de espera para el próximo disparo. }
  • 58. GameObject BuscarEnemigoCercano() { ArrayList enemigos = PoolingEnemigos.unidades; // Detecta al grupo de enemigos, se sospecha genera problemas para detectar al primero y al ultimo. GameObject temp; // Crea un espacio temporal para guardar el objetivo. foreach (object item in enemigos) { temp = (GameObject)item; // Rastrea específicamente los enemigos pertenecientes al arreglo, probablemente cree inconvenientes al agregar mas variantes de enemigo. if (Vector3.Distance(temp.transform.position, this.transform.position) < distancia_umbral && temp.GetComponent<Salud>().salud > 0) { return temp; // Detecta al enemigo en el rango de la torre, y evita detectar enemigos que ya hayan sido derrotados. } } return null; // Si no encuentra enemigos, no regresará nada, haciendo que la torre tampoco haga nada. } public GameObject Enemigo { get => enemigo; set => enemigo = value; } public bool Esta_activa { get => esta_activa; set => esta_activa = value; } }
  • 59. Salud
  • 60. public class Salud : MonoBehaviour { public int salud = 20; // Establece la salud de la unidad. public float retraso_muerte = 5f; // Genera un retraso antes de la desaparición de la unidad, actualmente sin ser usado, será reemplazado por la animación de muerte. void OnTriggerEnter(Collider collider) { if (collider.gameObject.CompareTag("Bala")) { salud -= 2; // Reduce la vida de la unidad al ser impactado por una bala. } } void Update() { if (salud <= 0) { retraso_muerte -= Time.deltaTime; // Activa el contador de muerte, será empleado por la animación de muerte. } if (retraso_muerte <= 0) { //Destroy(this.gameObject); Intento de desaparición de las unidades derrotadas, genera errores, desactivado hasta encontrar una solución o alternativa. } } }
  • 61. Video
  • 62.
  • 63.