Ho un problema con la risoluzione delle collisioni AABB.
Risolvo l'intersezione AABB risolvendo prima l'asse X, quindi l'asse Y. Questo viene fatto per prevenire questo errore: http://i.stack.imgur.com/NLg4j.png
Il metodo corrente funziona bene quando un oggetto si sposta nel giocatore e il giocatore deve essere spinto in orizzontale. Come puoi vedere in .gif, i picchi orizzontali spingono correttamente il giocatore.
Quando i picchi verticali si spostano nel giocatore, tuttavia, l'asse X viene ancora risolto per primo. Questo rende impossibile "usare le punte come un ascensore".
Quando il giocatore si sposta nei picchi verticali (influenzati dalla gravità, cade in essi), viene spinto sull'asse Y, perché all'inizio non c'era sovrapposizione sull'asse X.
Qualcosa che ho provato è stato il metodo descritto nella prima risposta di questo collegamento: rilevamento di collisioni di oggetti rettangolari 2D
Tuttavia, i picchi e gli oggetti in movimento si muovono cambiando la loro posizione, non la velocità, e non calcolo la loro prossima posizione prevista fino a quando non viene chiamato il loro metodo Update (). Inutile dire che questa soluzione non ha funzionato neanche. :(
Devo risolvere la collisione AABB in modo che entrambi i casi sopra descritti funzionino come previsto.
Questo è il mio attuale codice sorgente di collisione: http://pastebin.com/MiCi3nA1
Le sarei davvero grato se qualcuno potesse esaminarlo, dal momento che questo bug è stato presente nel motore fin dall'inizio, e ho avuto difficoltà a trovare una buona soluzione, senza successo. Questo mi sta seriamente facendo passare le notti a guardare il codice di collisione e mi impedisce di arrivare alla "parte divertente" e codificare la logica di gioco :(
Ho provato a implementare lo stesso sistema di collisione della demo del platform XNA AppHub (copiando e incollando la maggior parte delle cose). Tuttavia, il bug "jumping" si verifica nel mio gioco, mentre non si verifica nella demo di AppHub. [bug saltellante: http://i.stack.imgur.com/NLg4j.png ]
Per saltare, controllo se il giocatore è "onGround", quindi aggiungo -5 a Velocity.Y.
Dato che Velocity.X del giocatore è più alto di Velocity.Y (fare riferimento al quarto pannello nel diagramma), onGround è impostato su true quando non dovrebbe essere, e quindi consente al giocatore di saltare a mezz'aria.
Credo che ciò non accada nella demo di AppHub perché Velocity.X del giocatore non sarà mai superiore a Velocity.Y, ma potrei sbagliarmi.
L'ho risolto prima risolvendo prima sull'asse X, quindi sull'asse Y. Ma questo accorcia la collisione con le punte come ho detto sopra.