Platforming e fisica
Questi casi limite sono numerosi. I bravi platform divertenti non si comportano in alcun modo in modo fisicamente accurato e il controllo e il comportamento che i giocatori si aspettano dopo anni di platform "perfetti" come Mario sono incredibilmente difficili da implementare con tecniche generali come quelle ottenute con Box2D o altri motori fisici. La maggior parte dei bravi platform non utilizza alcun tipo di fisica generica o risposta alle collisioni nei controller dei suoi giocatori.
Genera scafi
Per quanto riguarda la tua domanda specifica, la soluzione migliore è smettere di usare le scatole come base. Utilizzare una serie di segmenti di linea collegati (uno scafo). Ciò consente al motore di rilevamento delle collisioni di concentrarsi solo sulle superfici effettivamente percorribili e di non guardare al bordo "falso" che esiste tra AB e BC. Questo è ciò che fa Box2D, in effetti. Le forme vengono utilizzate per generare le superfici esterne, che sono collegate tra loro per formare uno scafo.
Ne hai bisogno anche nei giochi basati su tessere o in situazioni in cui hai due oggetti AABB accanto ad altri che fungono da pavimento. Il motore di collisione raccoglierà quei bordi verticali e farà in modo che il giocatore li afferri. Ci sono hack che possono aiutare, ma non eliminare il problema. La soluzione è avere un solo segmento di linea che rappresenti la superficie anziché un riquadro 2D completo.
È possibile generare gli scafi nel caso generico tagliando i poligoni l'uno contro l'altro e unendo i punti di clip in un elenco di bordi.
Superfici inclinate
Poiché il tuo esempio include una pendenza e stai menzionando la restituzione e altre proprietà fisiche, ti segnalerò alcuni altri problemi che noterai presto, il che illustra ulteriormente perché il rilevamento e la risposta di collisioni generici non funzionano bene per i platform. Per prima cosa, prova a stare in piedi sulla piattaforma ad angolo, salta su e poi atterra. Probabilmente noterai che il personaggio "scivolerà" un po 'durante l'atterraggio. Il problema è che il contatto normale che stai generando di solito verrà indicato dalla superficie inclinata. Quindi, quando si risolve la collisione, il giocatore viene espulso in quella direzione. Anche se il personaggio stava cadendo verso il basso, verrà spinto verso l'alto e un po 'a destra durante l'atterraggio, risultando nella diapositiva. Questo può essere hackerato tenendo conto delle velocità relative,
Il secondo problema che noterai, che è molto più difficile da risolvere, è quello che succede quando provi a correre rapidamente giù da una rampa. Il giocatore "salterà" lungo la rampa. Questo è molto visibile anche nella maggior parte dei giochi AAA oggi. Non solo sembra sciocco, ma se il tuo gioco richiede che il giocatore sia messo a terra per saltare, rende difficile correre giù da una rampa e saltare a metà, perché il giocatore sta solo contattando la rampa durante una piccola porzione del il tempo trascorso scendendolo. Una soluzione più semplice consiste nel fare semplicemente alcuni lanci di raggio quando il giocatore si muove e agganciare la posizione del giocatore alla superficie più vicina (se è molto vicino al giocatore) se il giocatore non sta saltando ed era precedentemente a terra.
Potresti anche scoprire che il giocatore si lancia in aria quando corre su una rampa se provi a modellare velocità, attrito e restituzione sul giocatore come se fosse un normale corpo rigido. Il movimento del giocatore dovrebbe essere limitato al movimento orizzontale a meno che non cada / salti. Ovviamente, se giochi a platform più vecchi dell'età dell'oro, potresti notare che la velocità orizzontale del giocatore è spesso costante tra superfici orizzontali e inclinate. Questo deve essere preso in considerazione anche quando si cammina su / giù per le piste.
Ci saranno un certo numero di altri strani casi angolari in cui ti imbatterai anche tu. Se stai cercando di diventare un buon platform, è davvero meglio implementare un controller del giocatore platform separato dalla fisica e codificare il comportamento di movimento e controllo desiderato, piuttosto che fare affidamento sulla fisica generica e sull'algoritmo di risposta alle collisioni.