Buona fisica 2D Platformer [chiuso]


76

Ho un controller di caratteri di base impostato per un platform 2D con Box2D e sto iniziando a modificarlo per provare a farlo stare bene. I motori fisici hanno molte manopole da modificare, e non mi è chiaro, scrivendo con un motore fisico per la prima volta, quali dovrei usare. Il salto dovrebbe applicare una forza per diverse zecche? Un impulso? Impostare direttamente la velocità? Come posso impedire che l'avatar si attacchi alle pareti senza togliere tutta la sua frizione (o posso rimuovere tutta la frizione, ma solo nell'aria)? Dovrei modellare il personaggio come una capsula? Una scatola con angoli arrotondati? Una scatola con due ruote? Solo una grande ruota? Sento che qualcuno deve averlo fatto prima!

Sembra che ci siano pochissime risorse disponibili sul web che non siano "la prima fisica del bambino", il che interrompe il punto in cui spero che qualcuno abbia già risolto i problemi. La maggior parte degli esempi di motori fisici per i platform ha controlli di sensibilità fluttuanti, salti in aria o comportamenti facilmente sfruttabili quando la penetrazione temporanea è troppo elevata, ecc.

Alcuni esempi di cosa intendo:

  • Un breve tocco di salto salta a breve distanza; un lungo tocco salta più in alto.
  • Breve slittamento quando si arrestano o si invertono le direzioni ad alta velocità.
  • In piedi stabilmente su pendii (ma forse scivolando giù durante il ducking).
  • Velocità analogica quando si utilizza un controller analogico.
  • Tutte le altre cose che separano i bravi platform da quelli cattivi.
  • Oserei suggerire, piattaforme mobili stabili?

Non sto davvero cercando "ehi, fallo." Ovviamente, la cosa giusta da fare dipende da ciò che voglio nel gioco. Ma spero che qualcuno da qualche parte abbia attraversato le possibilità e abbia detto "bene la tecnica A presenta X bene, la tecnica B fa Y bene, ma questo non funziona con C", o ha alcuni esempi funzionanti oltre "se (key = = spazio) character.impulse (0, 1) "

Risposte:



25

È piuttosto difficile implementare, diciamo, la fisica "simile a Mario" usando un vero motore fisico.

L'ultima volta che ho provato questo, usando Chipmunk, ho modellato il giocatore come 2 cerchi - un "cerchio del corpo" sopra un "cerchio dei piedi"

Il "cerchio dei piedi" aveva un po 'di attrito, non rimbalzante e abbastanza piccolo. Il "cerchio del corpo" era più grande e privo di attriti, per evitare di attaccarsi a pareti / pendii ripidi

L'oggetto è stato costretto a non consentire la rotazione: sarebbe semplicemente scivolato

Se i 'piedi' toccano qualcosa o si trovano negli ultimi pochi fotogrammi (per consentire la caduta da pendii), il giocatore veniva considerato a terra (potrebbe anche aver avuto un controllo normale in superficie)

È da un po 'che non guardo il codice, ma il comportamento è stato simile a:

Quando a terra:

  • Applicare 'gravità aggiuntiva' (forza verso il basso per facilitare la discesa)
  • Applicare attrito al suolo (maggiore quantità di smorzamento orizzontale)
  • Applicare la forza di movimento sinistra / destra, in base ai controlli.
  • (Ridimensiona la forza di movimento sinistra / destra mentre si avvicina a una velocità massima di corsa)
  • Se si preme il salto, applicare l'impulso verso l'alto

Quando in aria:

  • Applicare resistenza all'aria (piccola quantità di smorzamento orizzontale)
  • Applicare gravità regolare (o ridotta)
  • Applica la forza di movimento sinistra / destra, se stai permettendo il controllo in aria

Devi stare un po 'attento nel passaggio tra i due stati - ricorda che quando corri giù per un pendio, potresti lasciare il terreno per un paio di fotogrammi - probabilmente non vuoi cambiare stato / non consentire il salto in quel punto

Alcune altre cose a cui fare attenzione, però ... le piattaforme "saltellanti" possono essere difficili da implementare e quando inizi a fare cose divertenti (piattaforme mobili, mondi rotanti, ecc.), Devi fare attenzione a assicurarsi che il giocatore non possa rimanere intrappolato / schiacciato da alcun oggetto in movimento "animato dall'animazione".


So che questa è una risposta piuttosto vecchia, ma ho alcune domande su questo. 1) Come risolvi "mantieni la stessa velocità qualunque sia la pendenza del terreno su cui ti trovi?" 2) Se stai usando un piccolo cerchio per i piedi e un cerchio più grande per il corpo, il giocatore non si appenderebbe ai bordi qualche volta? Sono davvero interessato al tuo approccio.
Notbad,

18

Onestamente non penso che usare un motore fisico sia l'approccio giusto per qualcosa di quel dominio di dimensioni con requisiti super severi.

Scrivi tutto da solo. Otterrai risultati molto migliori dicendo "sposta il carattere in alto di x unità in questa forma di parabola quando tieni premuto il pulsante di salto per la lunghezza y" piuttosto che avere un mucchio di manopole da modificare.


L'ho fatto diverse volte in passato. Funziona fino a un certo punto, ma finisci sempre per buttare fuori qualcos'altro perché è "troppo difficile" fare la fisica nel modo giusto con un controller bizzarro. In questo particolare gioco spero di coinvolgere alcune meccaniche a molla / fune per il movimento del giocatore, e questo è entrato nel regno di "Preferirei fare a pezzi un vero motore fisico" piuttosto che "Preferirei fare a pezzi una scatola motore".

3
Preferirei hackerare un motore di scatola, almeno non può diventare instabile, mentre un motore fisico tende ad esplodere se ci lanci troppe forze su di esso perché devi vincolare i movimenti a specifiche esatte (e vincoli del motore fisico ain ' t rigidi, possono solo provare a rispettare così tanto). Inoltre, applicare le forze per risolvere un problema indesiderato tende a influenzare tutto il resto, portando all'inferno.
Kaj,

10

Ho scritto una serie di articoli sulla costruzione di un gioco platform da zero utilizzando le moderne tecnologie e include il modo in cui ho gestito la fisica semplice:

http://www.wildbunny.co.uk/blog/2011/12/14/how-to-make-a-2d-platform-game-part-2-collision-detection/

Tuttavia, se si desidera qualcosa di più high-tech, è del tutto possibile avvicinarsi a questo utilizzando un motore fisico completo. Ecco una tecnica che puoi usare (da Little Big Planet) che rende il personaggio del giocatore una parte completamente integrata del motore fisico:

Invece di applicare impulsi o impostare velocità per spostare il giocatore come "input esterni" nel motore fisico, puoi sviluppare un vincolo che controlla il personaggio.

Quindi questo vincolo avrà la velocità e la direzione desiderate dal giocatore come input (dal gioco) e modellerà cose come la massima forza e velocità del giocatore. Il vincolo proverà a muovere il giocatore in base ai suoi input (e obbedendo al massimo), e poiché è un vincolo applicherà una forza uguale e opposta sull'oggetto su cui si trova il giocatore, permettendo così al giocatore di stare su piattaforme mobili e di influenzare le cose su cui si sposta.

Fare cose del genere significa che puoi avere il giocatore in modo totalmente naturale in grado di affrontare situazioni come essere sotto un enorme mucchio di scatole o saltare attraverso diverse piattaforme mobili perché ora è una parte fondamentale del motore fisico.

Spero che aiuti!

Saluti, Paul.


6

Questa domanda ha visto discussioni significative sui forum Box2D. Leggendo le discussioni sul movimento dei personaggi, sul salto o sul platform e ti imbatterai in ogni possibile problema. Tuttavia, il problema è diventato abbastanza complicato che il sistema di filtraggio delle collisioni è stato aggiornato e un esempio di Test Bed creato esclusivamente per mostrare come dovrebbe essere fatto.

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.