Menu
CoddyTech

Flash de Impacto

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

Quando você acerta um inimigo, o jogo deve mostrar isso imediatamente, mesmo antes de a barra de vida mudar. A maneira usual é um clarão de impacto: por alguns quadros, o inimigo é desenhado todo branco.

Isso requer um contador: os quadros restantes do clarão. Um acerto o define; a cada quadro, ele diminui:

flash = 0
...
# um acerto
hp -= 1
flash = 6
...
# a cada quadro
if flash > 0:
    flash -= 1

Ao desenhar, o contador escolhe a cor:

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

Seis quadros correspondem a um décimo de segundo: tempo suficiente para perceber, mas curto o bastante para que o próximo acerto possa causar outro clarão. O jogador consegue perceber de relance que o ataque acertou.

Um sprite com uma imagem pode piscar da mesma maneira: mantenha uma cópia branca da imagem ou preencha uma cópia com branco e desenhe-a enquanto o contador estiver ativo. Muitos jogos fazem o jogador piscar em vermelho quando ele sofre dano, usando o mesmo contador.

challenge icon

Desafio

Fácil

A barra de espaço atinge o inimigo vermelho e reduz seu HP. Faça cada golpe piscar:

  1. Defina flash = 0 antes do loop.
  2. Ao atingir, defina flash = 6.
  3. A cada quadro, reduza flash em 1 enquanto estiver acima de 0.
  4. Desenhe o inimigo em branco (255, 255, 255) enquanto flash estiver acima de 0; caso contrário, em vermelho.

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")
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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Som e sensação de jogo

Pratique por conta própria: Playground de Pygame