Flash all’impatto
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 13 di 23.
Quando colpisci un nemico, il gioco dovrebbe mostrarlo subito, anche prima che cambi una barra della salute. Il metodo abituale è un lampeggio da colpo: per alcuni fotogrammi il nemico viene disegnato tutto bianco.
Serve un contatore, che indica i fotogrammi di lampeggio rimasti. Un colpo lo imposta; a ogni fotogramma il suo valore diminuisce:
flash = 0
...
# un colpo
hp -= 1
flash = 6
...
# a ogni frame
if flash > 0:
flash -= 1Quando lo disegni, il contatore determina il colore:
if flash > 0:
pygame.draw.rect(screen, (255, 255, 255), enemy)
else:
pygame.draw.rect(screen, (220, 80, 80), enemy)Sei fotogrammi equivalgono a un decimo di secondo: abbastanza a lungo da essere visibili, ma abbastanza brevi da permettere al colpo successivo di far lampeggiare di nuovo il nemico. Il giocatore capisce subito che l’attacco è andato a segno.
Uno sprite con un’immagine può lampeggiare allo stesso modo: conserva una copia bianca della sua immagine, oppure riempi di bianco una copia, e visualizzala mentre il contatore è attivo. Molti giochi fanno lampeggiare in rosso il giocatore quando subisce danni, usando lo stesso contatore.
Sfida
FacileLa barra spaziatrice colpisce il nemico rosso e riduce i suoi HP. Fai lampeggiare ogni colpo:
- Imposta
flash = 0prima del ciclo. - Quando colpisci, imposta
flash = 6. - A ogni frame, riduci
flashdi 1 mentre è maggiore di 0. - Disegna il nemico in bianco
(255, 255, 255)mentreflashè maggiore di 0, altrimenti in rosso.
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")
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()
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
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