Menu
CoddyTech

Effetto pop alla raccolta

Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 18 di 23.

Quando raccogli una gemma, il punteggio aumenta di uno, ma stai guardando la gemma, non l’angolo. Un breve effetto pop attira lo sguardo sul contatore: l’icona diventa più grande con un salto, poi torna alle sue dimensioni.

Mantieni una scala, 1.0 per le dimensioni normali. Quando raccogli una gemma, impostala su 1.6; a ogni fotogramma torna gradualmente verso 1 usando la stessa riga di prima:

pop = 1.6         # quando viene raccolta una gemma

pop += (1 - pop) * 0.2    # a ogni frame

Quando disegni, la scala determina le dimensioni. Crea il Rect con quelle dimensioni e poi posiziona il suo centro, così l’icona si ingrandisce attorno al punto centrale invece che dall’angolo:

size = int(20 * pop)
icon = pygame.Rect(0, 0, size, size)
icon.center = (30, 30)

Il salto è istantaneo e il ritorno è graduale. È questo che dà l’impressione di un effetto pop: una frazione di 0.2 la riporta alle dimensioni iniziali in circa un quarto di secondo.

Per un’immagine, ridimensionala con pygame.transform.scale_by(image, pop) e centra il suo Rect allo stesso modo.

challenge icon

Sfida

Facile

Fai clic sulla gemma viola per raccoglierla. Fai rimbalzare l’icona dorata:

  1. Imposta pop = 1.0 prima del ciclo.
  2. Imposta pop = 1.6 quando raccogli una gemma.
  3. A ogni fotogramma, riportala gradualmente al valore iniziale: pop += (1 - pop) * 0.2.
  4. Disegna l’icona con una larghezza e un’altezza di int(20 * pop) pixel, mantenendola centrata in (30, 30).

Provalo tu

import random
import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Gem Picker")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)

coin_sound = pygame.mixer.Sound("assets/sounds/coin.ogg")
gem = pygame.Rect(300, 200, 24, 24)
score = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN and gem.collidepoint(event.pos):
            score += 1
            coin_sound.play()
            gem.topleft = (random.randint(80, 420), random.randint(90, 300))

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (170, 90, 230), gem)
    icon = pygame.Rect(0, 0, 20, 20)
    icon.center = (30, 30)
    pygame.draw.rect(screen, (255, 200, 60), icon)
    label = font.render(f"x {score}", True, (240, 240, 240))
    screen.blit(label, (52, 20))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

Tutte le lezioni di Suoni e sensazioni di gioco

Esercitati da solo: Playground Pygame