🟡 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:

import time

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

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)

🧠 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:

time.sleep(1)
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
# SPRITE TOBI

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.