Determinare player.isFalling () attraverso il cambio di y?


8

Attualmente sto usando Box2D e il mio personaggio è un gruppo di dispositivi in ​​Box2D. Mi chiedevo se, per determinare se un giocatore sta cadendo, rilevare un cambiamento nella posizione Y sarebbe appropriato?

Ci sono forse altri modi a cui non sto pensando? Come viene di solito rilevato questo genere di cose?


2
Un giocatore non avrebbe una velocità verso il basso per indicare la caduta?
Il comunista Duck il

1
Che cosa "cade" nel tuo caso comunque? È una semplice velocità al ribasso? È una non presenza di una superficie solida immediatamente sotto? Stai "cadendo" quando il tuo personaggio salta da un edificio e sta ancora viaggiando verso l'alto, ma ovviamente colpirà il cemento tra qualche secondo?
Anko,

@Aku Faling è in qualsiasi momento non avrebbe senso per lui saltare (dal momento che nessuna superficie da saltare)
jmasterx

3
Normalmente un motore fisico dovrebbe darti modi per controllare la normale di una collisione. Se è "alto" significa che il tuo giocatore è in piedi su qualcosa e dovrebbe essere in grado di saltare. Inversamente, se non si scontra, o se nessuna delle normali di collisione punta 'in alto', allora sta cadendo.
Jonathan Connell,

@Duck e @ 3nixios sembrano buone risposte, perché non ce la fanno .. ehm risponde;) Io, per chi vorrebbe votare
Maik Semder

Risposte:


9

(Dal mio commento.) Non ho familiarità con Box2D, ma normalmente un motore fisico dovrebbe darti modi di controllare la normale di una collisione.

Se è "alto" significa che il tuo giocatore è in piedi su qualcosa e dovrebbe essere in grado di saltare.

Inversamente, se non si scontra, o se nessuna delle normali di collisione punta 'in alto', allora sta cadendo.


3

Hai bisogno di due booleani isColidingWithGroundeisJumping

Quando l'utente preme il pulsante di salto, se lo isColidingWithGroundè true, ed isJumpingè falso, quindi chiama jump()quale imposta isJumpingsutrue

Se la yvelocità del giocatore è positiva, allora è isJumpingugualefalse

Se il giocatore si sta avvicinando al terreno, allora isColidingWithGround è uguale true, altrimenti è isColidingWithGrounduguale false.

A volte il giocatore è ancora in contatto con il terreno dopo l'impulso di salto iniziale, e trovo che usando queste due bandiere, impedisce che il salto () venga chiamato più volte quando si preme il salto.


Utilizzando questo metodo, sarebbe interessante verificare se il tasto di salto è stato premuto quando il giocatore stava cadendo e se è stato premuto come 200 ms prima di toccare il suolo, chiamare di jump()nuovo.
JCM,

2

Il modo in cui lo gestisco è che ogni giocatore ha un valore isJumpingbooleano che, quando salta, è impostato su true. Quando si scontrano con una superficie, controllo se è qualcosa da cui possono saltare e altre clausole come se stiano in piedi, ecc. E lo impostano false.

Quindi, quando provano a saltare, se la superficie su cui si trovano è buona e isJumping == falsepermetto loro di saltare, altrimenti non possono saltare. Penso che sia meglio che calcolare le collisioni ogni volta che vuoi vedere se stanno saltando.

Modifica
Come indicato da @BlueRaja di seguito, se l'utente esce dal bordo, lo isJumpingsarà ancora false. È possibile risolvere il problema con il EndContactmetodo del listener di contatti (vedere la sezione 9.4 Documenti Box2D . È sufficiente impostare la isJumpingproprietà su truequando cessa la collisione con il mondo.


2
E se si allontanano dal bordo senza saltare? isJumpingsarà false, ma ancora non dovrebbero essere autorizzati a saltare
BlueRaja - Danny Pflughoeft

@BlueRaja - Buon punto. Mi sono dimenticato di questo, ho anche un controllo sulle rotture delle collisioni. Vedi EndContactin 9.4 dalla documentazione di Box2d . Modifica risposta aggiornata.
Richard Marskell - Drackir,

0

Sposta tutti i componenti rilevanti nel tuo "mazzo di dispositivi" (che insieme rendono il giocatore) verso il basso di una piccola quantità e controlla le collisioni con tutto ciò che ritieni possibile saltare. Se non ci sono collisioni, il giocatore sta cadendo. Altrimenti, non lo è. Non dimenticare di spostare indietro i componenti di quello stesso importo.

Se il tuo personaggio è umanoide, dovresti probabilmente muoverti e controllare solo i piedi del personaggio, altrimenti il ​​tuo personaggio potrebbe finire per saltare anche quando si trova in testa!


0

Questo può o non può applicarsi, ma rileveremmo una differenza tra saltare / atterrare e cadere, quindi sapevamo quando passare a un'animazione in caduta, fare del danno per cadere troppo a lungo (non troppo lontano;)) e simili.

È stato praticamente fatto tenendo traccia di quanto tempo è rimasto un oggetto senza un punto di riferimento. Qualcosa sul terreno, o qualsiasi altro oggetto, aveva un riferimento a ciò su cui si trovava .. Non stare su nulla? Poi eri in aria, e dopo 1-2 secondi, stavi 'cadendo' invece di atterrare con grazia :)


0

In modo molto ingenuo e semplice, puoi verificare se il giocatore ha una velocità y (velocità, non velocità) che è> 0, supponendo che stai usando (0,0) come in alto a sinistra.

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.