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çãoDefina 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.
Desafio
MédioO 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:
- Defina
freeze = 0antes do loop. - No ponto em que o golpe reduz
hpa 0, definafreeze = 12. - Na atualização, enquanto
freezefor 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
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