Menu
CoddyTech

Destello de impacto

Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 13 de 23.

Cuando golpeas a un enemigo, el juego debería mostrarlo de inmediato, incluso antes de que cambie una barra de salud. La forma habitual es un destello al recibir un golpe: durante unos pocos fotogramas, el enemigo se dibuja completamente blanco.

Se necesita un contador que indique cuántos fotogramas quedan de destello. Un golpe lo activa; cada fotograma lo reduce:

flash = 0
...
# un golpe
hp -= 1
flash = 6
...
# en cada fotograma
if flash > 0:
    flash -= 1

Al dibujar, el contador determina el color:

if flash > 0:
    pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
    pygame.draw.rect(screen, (220, 80, 80), enemy)

Seis fotogramas son una décima de segundo: lo bastante para que se vea, pero lo bastante breve como para que el siguiente golpe pueda provocar otro destello. El jugador puede darse cuenta de un vistazo de que el ataque acertó.

Un objeto con una imagen puede destellar de la misma manera: conserva una copia blanca de su imagen, o rellena una copia de blanco, y dibújala mientras el contador esté activo. Muchos juegos hacen que el jugador destelle en rojo cuando recibe daño, usando el mismo contador.

challenge icon

Desafío

Fácil

La barra espaciadora golpea al enemigo rojo y reduce sus HP. Haz que cada golpe produzca un destello:

  1. Establece flash = 0 antes del bucle.
  2. Al golpear, establece flash = 6.
  3. En cada fotograma, reduce flash en 1 mientras sea mayor que 0.
  4. Dibuja al enemigo de color blanco (255, 255, 255) mientras flash sea mayor que 0; de lo contrario, de color rojo.

Pruébalo tú mismo

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Training Dummy")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

hit_sound = pygame.mixer.Sound("assets/sounds/hit.ogg")
player = pygame.Rect(120, 150, 60, 60)
enemy = pygame.Rect(300, 150, 60, 60)
hp = 5

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and hp > 0:
            hp -= 1
            hit_sound.play()

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), player)
    if hp > 0:
        pygame.draw.rect(screen, (220, 80, 80), enemy)
    label = font.render(f"Enemy HP: {hp}", True, (240, 240, 240))
    screen.blit(label, (300, 110))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Sonido y sensaciones del juego

Practica por tu cuenta: Playground de Pygame