Resumen de Programación Orientada a Objetos en Juegos
Programación Orientada a Objetos en Juegos: Guía Completa
Introducción
En este material estudiamos cómo desarrollar funcionalidades concretas de un juego (power-ups, obstáculos y sistema de aparición) aplicando principios de programación orientada a objetos como herencia, polimorfismo, abstracción y reutilización de código. Veremos un diseño práctico, ejemplos de implementación y decisiones de diseño para mantener el código claro y mantenible.
Definición: La herencia permite que una clase (subclase) reutilice atributos y métodos de otra (superclase), evitando duplicación de código.
Diseño general: responsabilidades y abstracción
Separación de responsabilidades
- Objeto Juego: controla el flujo general, temporizadores y colisiones.
- PowerUps y Obstáculos: encapsulan comportamiento específico de cada tipo de objeto que cae.
- Cuidador (player): recibe efectos al colisionar.
Definición: El principio de responsabilidad única establece que cada objeto/clase debe tener una única razón para cambiar.
Abstracción con superclases
- Crear una superclase
PowerUpy otraObstaculopermite implementar una sola vez el comportamiento común: posición, caída, reacción al viento, desaparición al tocar el suelo y método genérico de efecto al colisionar. - Las subclases (por ejemplo
Mandarina,Calafate,Frutilla,Corazon,Caca1,Caca2,Caca3) implementan únicamente las diferencias: imagen y el efecto concreto de colisión cuando aplica.
Definición: Polimorfismo: enviar el mismo mensaje a diferentes objetos (por ejemplo
efectoDeColision()) y permitir que cada objeto responda según su propia implementación.
Implementación de power-ups
Superclase PowerUp (comportamiento común)
- Atributos típicos: posición $(x,y)$, velocidad vertical, estado (activo/inactivo), sprite/imagen.
- Métodos comunes:
update()ocaer(): mueve el power-up según la gravedad y el viento.aplicarViento(fuerza): desplaza horizontalmente según la velocidad del viento.verificarSuelo(): marca para eliminación si llega al suelo.efectoDeColision(): método abstracto que cada subclase redefine.
Subclases y efectos concretos
- Mandarina: redefine
efectoDeColision()para aumentar temporalmente la velocidad del cuidador. - Calafate: comportamiento similar a Mandarina (aumenta velocidad).
- Frutilla: aumenta la velocidad; aparece únicamente en el nivel 2.
- Corazón: recupera una vida si el jugador no tiene ya el máximo de vidas.
Ejemplo conceptual de llamada polimórfica (en el gestor de colisiones):
powerUp.efectoDeColision()— sin preguntar el tipo concreto
Implementación de obstáculos
Superclase Obstaculo
- Igual estructura que PowerUp: posición, caída, respuesta al viento, desaparición al suelo y
efectoDeColision(). - En este caso el efecto común es reducir la velocidad del cuidador.
Jerarquía de cacas
ObstaculoCaca1Caca2Caca3(aparece solo en nivel 2)
Las subclases sólo cambian la imagen/sprite; el método efectoDeColision() puede estar implementado en la superclase si es idéntico para todas.
Sistema de aparición automática
Temporizadores y game.onTick()
- Usar un evento de tick global (
game.onTick()o similar) para contar tiempo y disparar la aparición de objetos. - Implementar métodos:
aparecerPowerUp()aparecerObstaculo()
- Ajustar la frecuencia según nivel:
- Nivel 1: power-ups cada ~4500 ms
- Nivel 2: power-ups cada ~2500 ms
Definición: Un evento de tick es una función que se ejecuta periódicamente (cada frame o cada intervalo) y permite actualizar el estado del juego y disparar acciones temporizadas.
Control de aparición por nivel
- Antes de seleccionar aleatoriamente el tipo de objeto, comprobar el nivel actual y restringir las opciones:
- Nivel 1: posibles = Mandarina, Calafate, Corazon, Caca1, Caca2
- Nivel 2: añadir Frutilla y Caca3
- Implementación práctica: variar la distribución aleatoria cambi
¿Ya tienes cuenta? Iniciar sesión
Power-ups y Obstáculos
Klíčové pojmy: Crear superclase PowerUp y Obstaculo para comportamiento común, Redefinir solo efectoDeColision() en subclases, Usar polimorfismo: llamar objeto.efectoDeColision() sin preguntar tipo, Controlar aparición con game.onTick() y contadores de tiempo, Nivel 1: power-ups cada ~4500 ms; nivel 2: cada ~2500 ms, Restringir tipos disponibles según nivel (Frutilla y Caca3 solo nivel 2), Evitar condicionales por tipo en gestor de colisiones, Documentar y testear efectos de cada subclase