Mantienilo discreto
Fa parte della sezione Suoni e sensazioni di gioco del percorso Pygame di Coddy. Lezione 15 di 23.
Il game feel è come il condimento. Un po' di scuotimento rende un atterraggio più pesante; troppo rende il gioco difficile da seguire e può far star male i giocatori. Due accorgimenti aiutano a tenerlo sotto controllo.
Poni un limite. Quando gli effetti si sommano, possono crescere all'infinito. Qui ogni atterraggio aggiunge 12 a shake; quattro casse che atterrano insieme lo portano oltre 40 e la visuale fa un salto di 13 pixel. min() impone un limite massimo:
shake = min(shake + 12, 18)Ora lo scuotimento dura più a lungo se le casse continuano ad atterrare, ma non sposta mai la visuale di più di 18 // 3, cioè 6 pixel.
Permetti ai giocatori di disattivarlo. Alcune persone non riescono a giocare mentre lo schermo si muove. Un'impostazione richiede una variabile:
shake_on = True
...
if shake_on:
offset = (random.randint(-amount, amount), random.randint(-amount, amount))Disegna l'etichetta dopo aver eseguito il blit del mondo, direttamente sullo schermo. Il testo che fa parte dell'interfaccia deve restare fermo mentre il mondo trema.
Sfida
MedioSpace fa cadere delle casse e ogni atterraggio aggiunge 12 a shake. Riduci l'intensità:
- Modifica l'atterraggio in modo che
shakenon superi mai 18:shake = min(shake + 12, 18). - Imposta
shake_on = Trueprima del ciclo; S lo attiva o disattiva. - Scegli uno spostamento casuale solo quando
shake_onè true. - Dopo aver disegnato il mondo, disegna
Shake: OnoShake: Offsullo schermo in(10, 10).
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()
font = pygame.font.Font(None, 28)
thud_sound = pygame.mixer.Sound("assets/sounds/thud.ogg")
falling = []
landed = []
shake = 0
world = pygame.Surface((480, 360))
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]
world.fill((30, 30, 46))
pygame.draw.rect(world, (80, 80, 100), (0, 300, 480, 60))
pygame.draw.rect(world, (80, 160, 255), (60, 220, 30, 80))
for crate in falling + landed:
pygame.draw.rect(world, (170, 110, 60), crate)
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)
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