Menu
CoddyTech

Pausa no Impacto

Parte da seção Som e sensação de jogo do Journey de Pygame da Coddy. Lição 14 de 23.

Um golpe forte causa mais impacto se o jogo parar por uma fração de segundo. Jogos de luta e ação fazem isso o tempo todo: depois de um golpe forte, tudo congela por alguns quadros e, então, continua. Isso se chama hit stop.

Use um contador novamente, com o número de quadros que faltam para descongelar. Enquanto ele estiver acima de 0, diminua seu valor e pule toda a atualização. Continue desenhando, para que o momento congelado permaneça na tela:

if freeze > 0:
    freeze -= 1
else:
    enemy.x += enemy_speed
    # ... o restante da atualização

Defina esse valor apenas nos golpes que importam. Aqui, o terceiro golpe derrota o inimigo, então esse golpe define freeze = 12, um quinto de segundo. Congelar o jogo a cada golpe pequeno faz com que ele pareça travado, em vez de impactante.

O contador do clarão faz parte da atualização, então também fica em espera: o inimigo permanece branco durante todo o congelamento, o som da explosão ressoa e, então, o jogo continua. Os eventos ainda são executados durante o congelamento, então um jogador que pressionar uma tecla nesse momento não será ignorado; aqui, a tecla Space só acerta enquanto hp > 0.

challenge icon

Desafio

Médio

O inimigo anda para a esquerda e para a direita; três acertos com a barra de espaço o derrotam. Congele o jogo no golpe que o derrota:

  1. Defina freeze = 0 antes do loop.
  2. No ponto em que o golpe reduz hp a 0, defina freeze = 12.
  3. Na atualização, enquanto freeze for maior que 0, diminua-o em 1 e ignore todo o restante da atualização. Mantenha o desenho como está.

Experimente você mesmo

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 as lições de Som e sensação de jogo

Pratique por conta própria: Playground de Pygame