Questo è per un progetto di gioco di piccole dimensioni con SDL su MinGW/Windows.Decisioni di successione/interfaccia per il motore fisico
Sto lavorando su un motore fisico, e la mia idea era di avere un Physics::Object
, che tutti gli oggetti fisici dovrebbero derivare da esso si registra con un Physics::System
classe globale (si tratta di un modello monostate) in modo che l'utente non lo fa è necessario tenere traccia di quali oggetti sono inclusi nei calcoli fisici e basta chiamare una funzione come Physics::System::PerformTimestepCalculation(double dt)
.
Questo funziona bene, e ho anche implementato utilizzando una sola classe derivata Physics::Circle
, che è un cerchio 2d. Sono stato abbastanza contento del rilevamento predittivo delle collisioni, anche se ho ancora bisogno di ottimizzarlo.
In ogni caso, ho riscontrato problemi quando ho iniziato ad aggiungere altri primitivi da includere nel calcolo, ad es. linea. Il numero Physics::System::PerformTimestepCalculation(double dt)
è diventato cosparso di chiamate a Object::GetID()
o funzioni simili (può essere un modo per evitare dynamic_cast <>), ma mi sento sporco.
Ho fatto un po 'di reading e ho capito che i miei elementi della mia gerarchia non sono sostituibili (vale a dire la collisione tra due cerchi è molto diversa tra la collisione di due linee).
Mi piace il modo in cui il mio "self register" viene registrato con la classe System
in modo che venga automaticamente incluso nei calcoli e non voglio veramente perdere questo.
Ci devono essere altri percorsi di progettazione sensibili. Come posso riprogettare meglio le cose in modo che gli oggetti non sostituibili non interferiscano?
Edit FYI: Alla fine ho rotto con entità e forma le proprietà, in modo simile a come è stato descritto nella risposta accettata, e simile a un modello entità-componenti del sistema. Significa che ho ancora la logica yuk di "è un cerchio o una linea, ed è una linea o un cerchio?", Ma non sto più fingendo che il polimorfismo mi aiuti qui. Significa anche che io uso una sorta di fabbrica e che possono avere più mondi di calcolo contemporaneamente!
Ti vuoi dire hanno un problema [doppio invio] (http://en.wikipedia.org/wiki/Double_dispatch)? Se ricordo bene, [Modern C++ Design] (http: //www.amazon.ca/Modern-Design-Generic-Programming-Patterns/dp/0201704315) ha un capitolo sulle tecniche di implementazione e potrebbe essere di vostro interesse. –