Sto usando Box2D per la prima volta seriamente in un gioco Flash di medie dimensioni su cui sto lavorando. La mia attuale esperienza con Box2D è limitata alla creazione di un mondo, corpi e l'aggiunta di quei corpi al mondo in modo funzionale.Come posso tenere traccia di tutte le collisioni di Box2D in modo pulito e gestibile?
Sto trovando abbastanza facile integrare Box2D nel mio ambiente di gioco, mantenendo codice ben scritto e completato alcuni tutorial che gestiscono le collisioni. Il problema che sto affrontando ora è che il mio gioco avrà molti corpi, ognuno interagendo con altri corpi in modi diversi, e sto trovando difficile scrivere la mia sottoclasse b2ContactListener
senza che questo diventi estremamente disordinato.
Sulla base di un tutorial che ho utilizzato, ho creato la mia sottoclasse di b2ContactListener
e aggiunto un override del metodo BeginContact()
. L'argomento che BeginContact()
riceve quando viene chiamato farà riferimento a un'istanza di b2Contact
, attraverso la quale posso accedere a due istanze b2Fixture
(le due istanze che sono entrate in conflitto). Sono quindi in grado di accedere all'istanza b2Body
associata a ciascuno di questi b2Fixture
s.
Problema: Attualmente ho un modo indiretto di scoprire che cosa si sono scontrati due cose (cioè se sono un muro e un missile, o il giocatore e un albero, ecc) che utilizza
GetUserData()
e sguardi come questo come esempio:var f1Player:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Player var f2Player:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Player var f1Tree:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Tree var f2Tree:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Tree // ... continutes with all possible combinations. // Example of managing a collision: if(f1Player && f2Tree) { // Player (FixtureA) and Tree (FixtureB) } if(f2Player && f1Tree) { // Player (FixtureB) and Tree (FixtureA) }
come si può vedere, questo sta per finire estremamente lungo e ingestibile. Devo anche scrivere ogni serie di azioni da eseguire due volte per far fronte a un determinato elemento che è FixtureA o FixtureB, o viceversa (ovviamente sotto forma di una chiamata di funzione con i parametri scambiati piuttosto che letteralmente riscritta).
Questo non è chiaramente l'approccio corretto, ma non sono stato in grado di individuare le risorse che spiegano in modo più approfondito la gestione di rilevamento delle collisioni.
Qualcuno ha esperienza con la gestione del rilevamento delle collisioni utilizzando Box2D che possono condividere? Inoltre, sta usando SetUserData(entityThatOwnsTheBody);
il modo corretto di usare quel metodo?
Sembra che la lunga dichiarazione "se" venga appena trasferita nella classe Being. Che ne dici di un'elaborazione che dovrebbe essere eseguita una sola volta per la collisione, ad es. suonare un suono o incrementare un punteggio. – iforce2d
@ iforce2d È vero, voglio dire che ci saranno le dichiarazioni 'if()' in ogni caso per aggiungere criteri per ciascuna combinazione di collisioni, ma questo sembra più organizzato di avere tutto in un unico file. Mi fornisce la possibilità di localizzare facilmente una collisione tra due cose tramite le classi rilevanti e non devo controllare quale sia l'Essere che per ogni collisione manualmente. – Marty
Come per le singole occorrenze, che possono essere gestite anche dall'individuo con un semplice 'hasBeenTouched' booleano o simile. – Marty