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 -= 1Al 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.
Desafío
FácilLa barra espaciadora golpea al enemigo rojo y reduce sus HP. Haz que cada golpe produzca un destello:
- Establece
flash = 0antes del bucle. - Al golpear, establece
flash = 6. - En cada fotograma, reduce
flashen 1 mientras sea mayor que 0. - Dibuja al enemigo de color blanco
(255, 255, 255)mientrasflashsea 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()
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
1Efectos de sonido
Cargar un sonidoSonido al ocurrir un eventoVolumen del sonidoSonidos y teclas presionadas4Sacudida de pantalla y destello de impacto
Sacudida de pantallaDestello de impactoPausa tras el impactoMantén la sutilezaPractica por tu cuenta: Playground de Pygame