✚ Sviluppo videogiochi

Coyote time e input buffer: i trucchi invisibili del game feel

Coyote time, input buffering, correzione degli spigoli e hit stop: piccoli accorgimenti invisibili che rendono i controlli di un gioco reattivi e giusti.

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.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche