Molti giocatori descrivono i controlli di un buon platform come «precisi» o «reattivi». Raramente sanno che, dietro le quinte, il gioco li sta aiutando: accetta salti leggermente in ritardo, ricorda pressioni leggermente in anticipo, sposta il personaggio di qualche pixel per evitargli di sbattere contro uno spigolo. Questi accorgimenti, spesso raccolti sotto l'etichetta di game feel, non rendono il gioco più facile in senso stretto: lo rendono giusto, perché fanno coincidere il risultato con l'intenzione del giocatore.
Il problema: gli esseri umani non sono precisi al fotogramma
A 60 fotogrammi al secondo, ogni fotogramma dura circa 16,7 millisecondi. Nessuno preme un tasto con questa precisione in modo costante. Se il gioco pretende che il salto venga premuto esattamente mentre il personaggio è ancora sul bordo della piattaforma, una parte dei salti fallirà, e il giocatore avrà la sensazione netta di aver premuto in tempo. Ha ragione: dal suo punto di vista lo ha fatto.
Coyote time
Il nome viene dai cartoni animati in cui il coyote corre oltre il bordo di un dirupo, resta sospeso per un istante e solo dopo precipita. Il coyote time concede lo stesso istante al giocatore: per un breve intervallo dopo aver lasciato una piattaforma, il salto è ancora consentito.
se a_terra:
tempo_da_terra = 0
altrimenti:
tempo_da_terra += dt
puo_saltare = tempo_da_terra < COYOTE // per esempio 0,1 s
Dettagli importanti:
- il coyote time va concesso solo se il personaggio ha lasciato il suolo cadendo, non dopo un salto, altrimenti diventa un doppio salto involontario;
- una volta usato, va azzerato subito;
- valori tipici stanno nell'ordine di qualche fotogramma, circa un decimo di secondo: abbastanza per correggere l'imprecisione, troppo poco per essere notato.
Input buffering
Il problema opposto: il giocatore preme salto un attimo prima di toccare terra. Senza aiuto, la pressione avviene in aria, non è valida, e quando il personaggio atterra non succede nulla. Il buffer dell'input memorizza la richiesta per un breve tempo:
se salto_premuto_ora:
buffer_salto = BUFFER // per esempio 0,1 s
altrimenti:
buffer_salto -= dt
se buffer_salto > 0 and puo_saltare:
salta()
buffer_salto = 0
Lo stesso principio si applica a molte altre azioni: un attacco premuto durante l'animazione del precedente, una schivata richiesta mentre si sta ancora atterrando, una combinazione nei picchiaduro. Il gioco «ricorda» la richiesta e la esegue al primo momento valido.
Correzione degli spigoli
Durante un salto, se la testa del personaggio sfiora l'angolo di un blocco sopra di sé di uno o due pixel, la collisione lo ferma bruscamente. Il giocatore percepisce un ostacolo che non c'era. La correzione degli spigoli (corner correction) controlla se spostando il personaggio di pochi pixel a sinistra o a destra la collisione scompare e, in quel caso, lo sposta e lascia proseguire il salto.
Lo stesso vale lateralmente: un personaggio che arriva a un gradino di un paio di pixel sotto il bordo di una piattaforma può essere sollevato automaticamente invece di fermarsi contro di essa.
Hitbox generose e ingenerose
Le forme di collisione non devono necessariamente corrispondere alla grafica:
| Elemento | Scelta tipica | Motivo |
|---|---|---|
| Hitbox del giocatore contro i pericoli | Più piccola dello sprite | I colpi «di striscio» non contano, il gioco sembra giusto |
| Hitbox degli oggetti da raccogliere | Più grande dello sprite | Raccogliere è gratificante, mancare per un pixel frustra |
| Hitbox dei nemici contro gli attacchi del giocatore | Leggermente più grande | I colpi visivamente vicini vanno a segno |
Hit stop e risposta all'impatto
Il game feel non riguarda solo l'equità, ma anche la sensazione di peso. Alcune tecniche diffuse:
- hit stop: quando un colpo va a segno, il gioco si ferma per pochissimi fotogrammi. Il cervello registra l'impatto, e il colpo sembra più potente.
- lampeggio: il nemico colpito diventa bianco per un istante.
- spinta: il bersaglio viene spostato indietro di qualche pixel.
- schiacciamento e allungamento: il personaggio si allunga leggermente nel salto e si schiaccia all'atterraggio, rendendo il movimento più vivo.
Combinati con un suono adeguato e un leggero scuotimento dello schermo, questi elementi trasformano un'interazione piatta in una soddisfacente.
Come tarare senza esagerare
Ogni aiuto ha un costo se diventa visibile. Un coyote time troppo lungo permette di saltare chiaramente dal vuoto; un buffer troppo lungo fa partire salti che il giocatore non voleva più. Alcuni consigli pratici:
- partire da valori piccoli, nell'ordine di 5-6 fotogrammi, e regolare provando;
- esprimere i valori in secondi, non in fotogrammi, per non dipendere dal frame rate;
- far provare il gioco a persone che non lo conoscono e osservare dove si lamentano di un comando «non preso»;
- rendere tutti i parametri modificabili mentre il gioco è in esecuzione.
Nel mio lavoro di prototipazione ho trovato utile un piccolo pannello che attiva e disattiva ciascun aiuto: provare lo stesso livello con e senza coyote time rende immediatamente evidente la differenza.
In sintesi
- Gli esseri umani non sono precisi al fotogramma: il gioco deve tenerne conto.
- Il coyote time permette di saltare per un istante dopo aver lasciato il bordo.
- L'input buffer ricorda le pressioni in anticipo e le esegue al primo momento valido.
- Correzione degli spigoli e hitbox calibrate eliminano collisioni percepite come ingiuste.
- Hit stop, lampeggi e schiacciamenti danno peso agli impatti, purché senza esagerare.