Pausa tras el impacto
Parte de la sección Sonido y sensaciones del juego del Journey de Pygame de Coddy. Lección 14 de 23.
Un gran golpe impacta con más fuerza si el juego se detiene durante una fracción de segundo. Los juegos de lucha y de acción lo hacen constantemente: con un golpe fuerte, todo se congela durante unos fotogramas y después continúa. Se llama hit stop.
Vuelve a usar un contador: los fotogramas que quedan para que termine la congelación. Mientras sea mayor que 0, haz que disminuya y omite toda la actualización. Sigue dibujando para que el momento congelado permanezca en la pantalla:
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... el resto de la actualizaciónActívalo solo con los golpes que importan. Aquí el tercer golpe derrota al enemigo, así que ese golpe establece freeze = 12, una quinta parte de un segundo. Congelar el juego con cada golpe pequeño hace que se sienta pesado, en lugar de contundente.
El contador del destello forma parte de la actualización, así que también espera: el enemigo permanece blanco durante toda la congelación, suena la explosión y después el juego continúa. Los eventos siguen ejecutándose durante la congelación, así que no se ignora a quien presione una tecla en ese momento; aquí, la barra espaciadora solo golpea mientras hp > 0.
Desafío
IntermedioEl enemigo camina hacia la izquierda y hacia la derecha; tres golpes con la barra espaciadora lo derrotan. Congela el juego con el golpe que lo derrota:
- Antes del bucle, establece
freeze = 0. - Cuando el golpe haga que
hpllegue a 0, establecefreeze = 12. - En la actualización, mientras
freezesea mayor que 0, réstale 1 y omite todo lo demás en la actualización. Mantén el dibujo tal como está.
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")
explosion_sound = pygame.mixer.Sound("assets/sounds/explosion.ogg")
enemy = pygame.Rect(100, 150, 60, 60)
enemy_speed = 2
hp = 3
flash = 0
defeated = 0
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
flash = 6
if hp == 0:
explosion_sound.play()
else:
hit_sound.play()
enemy.x += enemy_speed
if enemy.left < 40 or enemy.right > 440:
enemy_speed = -enemy_speed
if flash > 0:
flash -= 1
if hp == 0:
defeated += 1
hp = 3
enemy.x = 100
screen.fill((30, 30, 46))
if flash > 0:
pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
pygame.draw.rect(screen, (220, 80, 80), enemy)
label = font.render(f"HP: {hp} Defeated: {defeated}", True, (240, 240, 240))
screen.blit(label, (20, 20))
pygame.display.flip()
clock.tick(60)
pygame.quit()
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