🟡 Capítulo 4: Sistema de daño real (sin perder todas las vidas de golpe)
Ya tienes un enemigo que persigue…
Pero ahora aparece un problema muy típico:
👉 al tocar al enemigo, pierdes TODAS las vidas en un instante.
🎮 ¿Por qué pasa esto?
Porque el juego funciona en bucle (while True).
Eso significa que:
- La colisión se detecta muchas veces por segundo
- Cada detección quita vida
👉 Resultado: vidas = 0 en menos de un segundo
🧠 Solución real de videojuegos
Cuando recibes daño…
👉 debes ser invulnerable durante un pequeño tiempo.
Esto se llama:
🟡 "Tiempo de invulnerabilidad"
💻 Paso 1: Variables necesarias
En el sprite Tobi:
tobi = Sprite("Tobi")
vidas = 3
puede_recibir_dano = True
🧠 ¿Qué significa esto?
- vidas → vida del jugador
- puede_recibir_dano → controla si puede recibir daño
👉 Esta variable es la clave del sistema.
💻 Paso 2: Movimiento + colisión controlada
if tobi.iskeypressed("w"):
tobi.move(10)
if tobi.isTouching("Enemy") and puede_recibir_dano:
vidas = vidas - 1
puede_recibir_dano = False
tobi.say("¡Golpe!", 0.5)
🧠 Qué está pasando aquí
- Solo pierde vida si puede_recibir_dano es True
- Después del golpe → pasa a False
👉 Esto evita múltiples golpes seguidos.
💻 Paso 3: Recuperar la invulnerabilidad
Después de recibir daño, esperamos un poco:
puede_recibir_dano = True
👉 Ahora Tobi vuelve a poder recibir daño.
🎮 Resultado final
- Recibes daño una vez
- Tienes un tiempo de protección
- El juego se vuelve justo y jugable
👉 Esto es exactamente como funcionan los videojuegos reales.
⚡ Mejora visual (opcional pero PRO)
Puedes hacer que Tobi parpadee cuando recibe daño:
- Ocultarlo y mostrarlo rápido
- Dar sensación de invulnerabilidad
👉 Esto es típico en juegos profesionales.
🚀 Reto Abutuber: Sistema de vida real
Mejora tu juego:
- El enemigo persigue
- Tobi pierde vida al tocarlo
- No puede perder varias vidas seguidas
- Tiene un tiempo de invulnerabilidad
Extra: Añade efecto visual cuando reciba daño.
👉 Si no te sale, aquí tienes el código completo:
👀 Ver código completo
import time
tobi = Sprite("Tobi")
vidas = 3
puede_recibir_dano = True
while True:
if tobi.iskeypressed("w"):
tobi.move(10)
if tobi.istouching("Enemy") and puede_recibir_dano:
vidas = vidas - 1
puede_recibir_dano = False
tobi.say("¡Golpe!", 0.5)
time.sleep(1)
puede_recibir_dano = True
# SPRITE ENEMY
enemy = Sprite("Enemy")
tobi = Sprite("Tobi")
while True:
if enemy.x < tobi.x:
enemy.move(2)
if enemy.x > tobi.x:
enemy.move(-2)
💡 Consejo Abutuber: Si un juego es injusto, el jugador lo abandona. Este sistema hace que tu juego sea jugable de verdad.