Menu
CoddyTech

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.

challenge icon

Sfida

Medio

Space fa cadere delle casse e ogni atterraggio aggiunge 12 a shake. Riduci l'intensità:

  1. Modifica l'atterraggio in modo che shake non superi mai 18: shake = min(shake + 12, 18).
  2. Imposta shake_on = True prima del ciclo; S lo attiva o disattiva.
  3. Scegli uno spostamento casuale solo quando shake_on è true.
  4. Dopo aver disegnato il mondo, disegna Shake: On o Shake: Off sullo 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()
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