Menu
CoddyTech

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 -= 1

Quando 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.

challenge icon

Sfida

Facile

La barra spaziatrice colpisce il nemico rosso e riduce i suoi HP. Fai lampeggiare ogni colpo:

  1. Imposta flash = 0 prima del ciclo.
  2. Quando colpisci, imposta flash = 6.
  3. A ogni frame, riduci flash di 1 mentre è maggiore di 0.
  4. Disegna il nemico in bianco (255, 255, 255) mentre flash è 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()
quiz iconMettiti alla prova

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

Esercitati da solo: Playground Pygame