Pausa all’impatto
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 14 di 23.
Un colpo potente ha più impatto se il gioco si ferma per una frazione di secondo. I giochi di combattimento e d'azione lo fanno continuamente: dopo un colpo forte, tutto si blocca per alcuni fotogrammi e poi riprende. Si chiama pausa all'impatto.
Usa di nuovo un contatore, che indica i fotogrammi rimanenti del blocco. Finché è maggiore di 0, riducilo e salta l'intero aggiornamento. Continua a disegnare, così il momento di stasi rimane sullo schermo:
if freeze > 0:
freeze -= 1
else:
enemy.x += enemy_speed
# ... il resto dell'aggiornamentoImpostalo solo per i colpi che contano. Qui il terzo colpo sconfigge il nemico, quindi quel colpo imposta freeze = 12, un quinto di secondo. Bloccare il gioco a ogni piccolo colpo lo fa sembrare appiccicoso invece che potente.
Il contatore del lampo fa parte dell'aggiornamento, quindi anche lui si ferma: il nemico rimane bianco per tutta la pausa, il suono dell'esplosione risuona e poi il gioco riprende. Gli eventi continuano a essere eseguiti durante la pausa, quindi un giocatore che preme un tasto in quel momento non viene ignorato; qui la barra spaziatrice colpisce solo quando hp > 0.
Sfida
MedioIl nemico cammina a sinistra e a destra; tre colpi con la barra spaziatrice lo sconfiggono. Congela il gioco con il colpo che lo sconfigge:
- Imposta
freeze = 0prima del ciclo. - Quando il colpo porta
hpa 0, impostafreeze = 12. - Nell’aggiornamento, finché
freezeè maggiore di 0, decrementalo di 1 e salta tutto il resto dell’aggiornamento. Lascia il disegno così com’è.
Provalo tu
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()
Tutte le lezioni di Suoni e sensazioni di gioco
1Effetti sonori
Caricare un suonoSuono al verificarsi di un eventoVolume del suonoSuoni e tasti tenuti premuti4Scuotimento dello schermo e flash all’impatto
Scuotimento dello schermoFlash all’impattoPausa all’impattoMantienilo discretoEsercitati da solo: Playground Pygame