Menu
CoddyTech

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ón

Actí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.

challenge icon

Desafío

Intermedio

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

  1. Antes del bucle, establece freeze = 0.
  2. Cuando el golpe haga que hp llegue a 0, establece freeze = 12.
  3. En la actualización, mientras freeze sea 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

Practica por tu cuenta: Playground de Pygame