Scuotimento dello schermo
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 12 di 23.
Una cassa pesante colpisce il suolo e l'intera visuale sobbalza per un momento. Questo è il tremolio dello schermo: per alcuni fotogrammi, tutto viene disegnato spostato di alcuni pixel, in modo diverso a ogni fotogramma.
Per spostare tutto insieme, disegna il mondo su una Surface dedicata invece che sullo schermo, poi esegui il blit di quella Surface sullo schermo con un offset:
world = pygame.Surface((480, 360))Nel ciclo, le chiamate di disegno che usavano screen ora usano world. Poi scegli l'offset:
offset = (0, 0)
if shake > 0:
amount = shake // 3
offset = (random.randint(-amount, amount), random.randint(-amount, amount))
shake -= 1
screen.fill((0, 0, 0))
screen.blit(world, offset)shake conta i fotogrammi rimanenti del tremolio. Un atterraggio lo imposta a 12. Poiché amount è shake // 3, nei primi fotogrammi lo spostamento arriva fino a 4 pixel, poi a 3, 2, 1 e infine a zero: il sobbalzo si attenua gradualmente invece di interrompersi di colpo. Prima riempi lo schermo di nero, perché un mondo spostato di 4 pixel lascia scoperta una sottile striscia.
Sfida
MedioLa barra spaziatrice fa cadere una cassa e, quando questa atterra, imposta shake = 12, che per ora non viene utilizzato. Fai tremare la visuale:
- Prima del ciclo, crea
world = pygame.Surface((480, 360)). - Disegna lo sfondo, il terreno, il palo e le casse su
worldinvece che suscreen. - Mentre
shakeè maggiore di 0, scegli un offset conamount = shake // 3erandom.randint(-amount, amount)per x e y, poi diminuiscishakedi 1. - Riempi lo schermo di nero e disegna
worldall'offset.
Provalo tu
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Crate Drop")
clock = pygame.time.Clock()
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 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:
falling.append(pygame.Rect(random.randint(140, 400), -40, 40, 40))
for crate in falling:
crate.y += 8
if crate.bottom >= 300:
crate.bottom = 300
landed.append(crate)
thud_sound.play()
shake = 12
falling = [crate for crate in falling if crate.bottom < 300]
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(screen, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(screen, (170, 110, 60), crate)
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