2011-07-04 16 views
6

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif2D platform AABB problemi di collisione

Ho un problema con una risoluzione di collisione AABB.


Risolvo l'intersezione AABB risolvendo prima l'asse X, poi l'asse Y. Questo viene fatto per evitare che questo bug: http://i.stack.imgur.com/NLg4j.png


L'attuale metodo funziona bene quando un oggetto si muove nel lettore e il giocatore deve essere spinto in senso orizzontale. Come puoi vedere nel file .gif, i picchi orizzontali spingono il giocatore correttamente.


Quando i picchi verticali si spostano nel lettore, tuttavia, l'asse X viene comunque risolto per primo. Questo rende "impossibile usare le punte come un ascensore".

Quando il giocatore si muove verso le punte verticali (colpite dalla gravità, cade su di esse), viene spinto sull'asse Y, poiché all'inizio non c'era alcuna sovrapposizione sull'asse X.


Una cosa che ho provato è stato il metodo descritto nel first answer of this link. Tuttavia, i picchi e gli oggetti in movimento si spostano cambiando la loro posizione, non la velocità, e non calcoliamo la loro prossima posizione prevista finché non viene chiamato il loro metodo Update(). Inutile dire che questa soluzione non ha funzionato neanche. :(


Ho bisogno di risolvere AABB di collisione in un modo che entrambi i casi sopra descritti il ​​lavoro come previsto

Questo è il mio codice sorgente di collisione corrente:. http://pastebin.com/MiCi3nA1

Sarei Davvero grato se qualcuno potesse esaminare questo, dal momento che questo bug è stato presente nel motore fin dall'inizio, e ho faticato a trovare una buona soluzione, senza alcun successo. al codice di collisione e impedendomi di arrivare alla "parte divertente" e codificando la logica di gioco :(


Ho provato ad implementare lo stesso sistema di collisione della demo del platformer XNA AppHub (incollando la maggior parte delle cose). Tuttavia il bug "saltante" si verifica nel mio gioco, mentre non si verifica nella demo di AppHub. [salto bug: http://i.stack.imgur.com/NLg4j.png]

Per saltare controllo se il lettore è "onGround", quindi aggiungi -5 a Velocity.Y.

Poiché Velocity.X del lettore è 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 questo non accada nella demo di AppHub perché Velocity.X del lettore non sarà mai più alto di Velocity.Y, ma potrei sbagliarmi.

Ho risolto prima risolvendo prima l'asse X, quindi sull'asse Y. Ma questo rovina la collisione con le punte come ho detto sopra.

+0

FYI Ecco la stessa domanda su gamedev.stackexchange.com - ha più risposte: http://gamedev.stackexchange.com/questions/14486/2d-platformer-aabb-collision-problems?lq=1 – LearnCocos2D

risposta

0

Una possibile soluzione che ho trovato è ordinare gli oggetti prima di risolverli in base alla velocità del lettore.

0

Perché non risolvere prima sull'asse Y per i picchi verticali e sull'asse X prima per i picchi orizzontali?

Bella grafica, a proposito.


Da quanto ho capito, il gioco è la gestione e il movimento di collisione o meno così:

  1. Spostare tutti gli oggetti.
  2. Per ogni oggetto O, test intersezione tra il giocatore e O, e, se necessario, espellere il lettore orizzontalmente o verticalmente in modo che non sia più interseca con O.
  3. Se il lettore si sta ancora intersecando con qualche oggetto, quindi (qualcosa).

Ciò significa che quando si arriva al punto (2), avete dimenticato in che modo l'oggetto O stava muovendo, quindi non si può dire se si sta cercando di spingere il giocatore verso l'alto o lateralmente.

Soluzione: al punto (1), memorizzare per ogni oggetto la direzione in cui si sta muovendo. Quando trovi il giocatore che si interseca con un oggetto, puoi guardare se l'oggetto si sta muovendo in alto, in basso, a sinistra o a destra, e questo ti dirà in che modo eseguire l'espulsione.

+0

Questo è il soluzione "last resort". Preferirei trovare una soluzione generale che funzioni in ogni situazione "automaticamente". –

+0

Non eri intenzionato a passare alla "parte divertente"? ;) Questa soluzione sembra abbastanza buona, forse è l'unica/migliore soluzione. Provalo e muovine uno, puoi sempre tornare più tardi. – LearnCocos2D

+0

Vieni a pensarci, devi gestire le "piattaforme" in movimento in modo diverso rispetto alle tessere di collisione statiche. Quando il giocatore è in cima a una piattaforma mobile, lo muovi con la piattaforma che indica ogni fotogramma che aggiungi la posizione delta del movimento della piattaforma alla posizione del giocatore prima di valutare le collisioni. Ciò richiede lo spostamento delle piattaforme prima che il giocatore si muova. Vedi la sezione della piattaforma qui: http://higherorderfun.com/blog/2012/05/20/the-guide-to-implementing-2d-platformers/ – LearnCocos2D

0

Come già affermato da Gareth Rees, il problema è dopo che è stata rilevata una collisione, per ottenere la risposta di collisione sono necessarie più informazioni (sia la posizione corrente e una direzione o l'ultima posizione).

Diventa piuttosto complicato se entrambi gli oggetti si stanno muovendo. Invece, scegli un oggetto come fotogramma di riferimento e sottrai la sua velocità da tutto il resto.

Una soluzione diretta potrebbe essere quella di creare segmenti di linea per il movimento/delta dell'oggetto non di riferimento. Quindi interseca quei segmenti con i 4 bordi AABB. Questo dà il tempo di intersezione e la normale al punto di intersezione. Quindi puoi applicare la stessa risposta che hai ora.

Problemi correlati