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 -= 1Ao 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.
Desafio
FácilA barra de espaço atinge o inimigo vermelho e reduz seu HP. Faça cada golpe piscar:
- Defina
flash = 0antes do loop. - Ao atingir, defina
flash = 6. - A cada quadro, reduza
flashem 1 enquanto estiver acima de 0. - Desenhe o inimigo em branco
(255, 255, 255)enquantoflashestiver 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()
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
4Vibração da Tela e Flash de Impacto
Vibração da TelaFlash de ImpactoPausa no ImpactoMantenha a DiscriçãoPratique por conta própria: Playground de Pygame