Salto impulsivo


12

C'è una cosa che mi ha sconcertato, ed è come implementare un salto 'impulsivo' in un platform. Se non sai di cosa sto parlando, pensa ai salti di Mario, Kirby e Quote di Cave Story. Cosa hanno in comune? Bene, l'altezza del salto è determinata dalla durata della pressione del pulsante di salto.

Sapendo che gli "impulsi" di questi personaggi non sono costruiti prima del loro salto, come nella fisica reale, ma piuttosto mentre sono a mezz'aria , cioè puoi benissimo sollevare il dito a metà dell'altezza massima e si fermerà, anche se con desaccelerazione tra esso e il punto fermo; ed è per questo che puoi semplicemente toccare per un salto e tenerlo premuto per un salto in lungo -, sono affascinato da come mantengono i loro trajetories come archi.

La mia attuale implementazione funziona come segue:

inserisci qui la descrizione dell'immagine

Mentre si preme il pulsante di salto, la gravità viene disattivata e il coordinato Y dell'avatar viene diminuito dal valore costante della gravità. Ad esempio, se le cose cadono in unità Z per tick, aumenteranno le unità Z per tick.

Una volta rilasciato il pulsante o raggiunto il limite, l'avatar si disaccelera in una quantità tale da coprire X unità fino a quando la sua velocità non raggiunge 0; una volta che lo fa, accelera fino a quando la sua velocità corrisponde alla gravità - attenendosi all'esempio, potrei dire che accelera da 0 a Z unità / tick mentre copre ancora le unità X.

Questa implementazione, tuttavia, rende i salti troppo diagonali e, a meno che la velocità dell'avatar non sia più veloce della gravità, il che lo renderebbe troppo veloce nel mio progetto attuale (si sposta di circa 4 pixel per tick e la gravità è di 10 pixel per tick, a un framerate di 40FPS), lo rende anche più verticale che orizzontale. Coloro che hanno familiarità con i platform si accorgerebbero che il salto con l'arco del personaggio consente quasi sempre loro di saltare ulteriormente anche se non sono veloci quanto la gravità del gioco, e quando non lo fanno, se non giocati bene, si dimostrerebbero molto controintuitivo. Lo so perché potrei attestare che la mia implementazione è molto fastidiosa.

inserisci qui la descrizione dell'immagine

Qualcuno ha mai provato una meccanica simile e forse ci è riuscito? Mi piacerebbe sapere cosa c'è dietro questo tipo di Platform Platform. Se non hai mai avuto alcuna esperienza con questo in precedenza e vuoi provarlo, per favore, non provare a correggere o migliorare la mia implementazione spiegata, a meno che non fossi sulla strada giusta - prova a inventare la tua soluzione da graffiare. Non mi importa se usi la gravità, la fisica o quant'altro, finché mostra come funzionano questi pseudo-impulsi, fa il lavoro.

Inoltre, vorrei che la sua presentazione evitasse una codifica specifica della lingua; tipo, condividendoci un esempio C ++ o Delphi ... Per quanto sto usando il framework XNA per il mio progetto e non mi dispiacerebbe roba C #, non ho molta pazienza per leggere il codice degli altri, e sono alcuni sviluppatori di giochi di altre lingue sarebbero interessati a ciò che realizziamo qui, quindi non preoccuparti di attenersi allo pseudo-codice.

Grazie in anticipo


3
Hai dato un'occhiata alla seguente domanda e alle sue risposte? gamedev.stackexchange.com/questions/29617/…
bummzack

@bummzack Anche questo è molto chiaro.
Mutoh,

1
possibile duplicato della gestione del salto e della gravità Sebbene non abbia belle immagini, è la stessa domanda.
MichaelHouse

Risposte:


8

Penso che il tuo problema principale risieda qui:

Mentre si preme il pulsante di salto, la gravità viene disattivata e il coordinato Y dell'avatar viene diminuito dal valore costante della gravità. Ad esempio, se le cose cadono in unità Z per tick, aumenteranno le unità Z per tick.

La gravità non funziona così. Google "movimento uniformemente accelerato" per i dettagli, ma in termini semplici, come ha detto un altro collega, la gravità è un'accelerazione, non una velocità.

Per dirla semplicemente, mentre la velocità è il tasso costante di cambiamento di posizione nel tempo, l'accelerazione è il tasso costante di cambiamento di velocità nel tempo.

Quindi il tuo primo ordine di attività sarebbe quello di cambiare il tuo algoritmo di caduta per includere l'accelerazione, non solo la velocità. Invece di:

pos_y = pos_y + (velocity_y * time_difference)

dovresti fare qualcosa del genere

pos_y = pos_y + (velocity_y * time_difference) + (gravity_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (acceleration_y * time_difference)

In questo modo tutto cadrà in una parabola, che è il movimento fisicamente corretto.

Ora, per implementare il salto semplice (arriveremo alla tua domanda esatta subito dopo), devi semplicemente impostare il velocity_yvalore desiderato. Finché il segno per acceleration_ye quello desiderato velocity_ysono diversi, il tuo oggetto salterà correttamente (in altri termini, non "spegni la gravità". Lo tieni acceso e semplicemente imposta la velocità dell'oggetto su un valore predefinito).

Noterai che maggiore velocity_yè quando inizi a saltare, maggiore sarà il salto. Quindi, per implementare l'effetto desiderato, aggiungi una sorta di accelerazione al salto (in termini fisici, questo significa aggiungere una forza. Pensa di aggiungere un piccolo razzo all'oggetto).

Per fare questo, fai la stessa cosa di prima, ma ora l'accelerazione e la velocità dovrebbero avere lo stesso segno. Puoi farlo tenendo premuto il pulsante:

pos_y = pos_y + (velocity_y * time_difference) + (force_y * (time_difference ^ 2) / 2)
velocity_y = velocity_y + (force_y * time_difference)

4

La soluzione non è ritardare la decelerazione. Quando lanci una palla in aria, non si muove a velocità costante fino a raggiungere la sua altezza massima, ma decelera dal momento dell'impulso.

La gravità non è una velocità, ma un'accelerazione. Quindi se un giocatore ha una velocità verso l'alto di 20 unità e la gravità è -10 unità, al prossimo tick, la velocità verso l'alto sarebbe di 10 unità, alle successive, 0 unità, ecc.

Il motivo per cui i tuoi salti sembrano così diagonali è perché la velocità del tuo giocatore su e giù è costante. Quindi se letteralmente tracciate una linea seguendo il percorso del giocatore, vedrete una linea con l'inclinazione, positiva o negativa, del vostro valore di gravità rispetto al cambiamento nella posizione x.

Affinché il tuo giocatore controlli l'altezza del tuo salto, al tuo giocatore dovrebbe essere data una certa velocità iniziale all'impulso, la gravità dovrebbe essere disattivata e un valore di gravità speciale (inferiore alla gravità normale) dovrebbe essere applicato alla velocità del giocatore. Una volta rilasciato il pulsante di salto o la velocità del giocatore raggiunge 0, dovrebbe essere applicata la gravità normale.

In questo modo, il giocatore vedrà una bella curva durante il salto, sia che deceleri o meno con la gravità normale.


2

La storia breve è: avrai una sezione non parabolica nel tuo arco di salto da qualche parte.

Ho provato alcuni approcci durante l'implementazione del salto:

  • Salita costante: questo sembra essere, in effetti, quello che stavi provando: avere la velocità verticale positiva fissata fino a quando il pulsante non viene rilasciato, a quel punto entra in gioco la gravità normale. L'arco è diagonale in salita, ma normale in caduta - questo in realtà sembra normalmente OK e (cosa ancora più importante) sembra OK, poiché è abbastanza facile giudicare bene l'altezza del salto.

  • Salita arrestata: è qui che inizi il personaggio a salire alla parabola della massima altezza, applicando un impulso iniziale. Quindi, quando il pulsante viene rilasciato, si imposta la velocità verticale su zero (o una piccola velocità verso l'alto). Ciò significa che i tuoi salti più grandi sono una parabola garantita, e i salti più piccoli sembrano più come se stessi facendo un grande salto che poi rallenti.

  • Impulso iniziale variabile: questo è quello su cui ho optato per: premendo il salto si applica un impulso iniziale verso l'alto sufficiente per un salto, quindi si continua ad applicare l'accelerazione verso l'alto (molto più grande della gravità) per un breve periodo - la finestra del salto - fino a quando il il pulsante è stato rilasciato. Una volta chiusa la finestra di salto, il movimento sarebbe parabolico e il periodo di impulso iniziale variabile era abbastanza breve da non sembrare strano, ma era abbastanza lungo da dare a un giocatore esperto abbastanza spazio per controllare l'altezza del salto. Il rovescio della medaglia era che non era facile giudicare l'altezza del salto, poiché la finestra era molto più piccola e non aveva la corrispondenza del momento di rilascio all'altezza. Come è accaduto la maggior parte delle volte, volevi comunque un tocco o un salto completo, quindi non è stato un problema del genere.

Prova questi e vedi quale si sente meglio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.