Attualmente sto affrontando il seguente problema:
Sto cercando di scrivere un clone pong utilizzando un sistema di componenti entità (ECS). Ho scritto il "framework" da solo. Quindi esiste una classe che gestisce le entità con tutti i componenti. Quindi ci sono le classi componenti stesse. E infine ci sono i miei sistemi che ottengono solo tutte le entità che hanno componenti di cui il sistema ha bisogno.
Quindi, ad esempio, il mio sistema di movimento cerca tutte le entità che hanno una componente di posizione e una componente di movimento. Il componente posizione mantiene solo la posizione e il componente movimento mantiene la velocità.
Ma il vero problema è il mio sistema di collisione. Questa classe è come un BLOB logico. Ho così tanti casi speciali in questa classe.
Ad esempio: I miei paddle possono scontrarsi con i bordi. Se ciò accade, la loro velocità è impostata su zero. La mia palla può anche scontrarsi con i bordi. Ma in questo caso la sua velocità è solo speculare alla normale del bordo, quindi viene riflessa. Per fare questo ho dato alla palla un componente fisico aggiuntivo che dice semplicemente: "Ehi, questa cosa non si ferma, riflette". Quindi, in realtà, il componente fisico non ha dati reali. È una classe vuota che è proprio lì per dire al sistema se un oggetto si riflette o si ferma.
Poi arriva questo: voglio rendere alcune particelle quando la palla si scontra con le pagaie o i bordi. Quindi penso che la palla debba ottenere un altro componente che dice al sistema di collisione di creare particelle sulla collisione.
Quindi voglio avere potenziamenti che possono scontrarsi con i paddle ma non con i bordi. Se ciò accade, i power-up devono scomparire. Quindi avrei bisogno di molti più casi e componenti (per dire al sistema che alcune entità possono scontrarsi solo con alcuni altri, il bot non con tutti anche se alcuni altri sono effettivamente in grado di scontrarsi, inoltre il sistema di collisione ha dovuto applicare i power-up a paddle, ecc. ecc. ecc.).
Vedo che il sistema di componenti di entità è una buona cosa perché è flessibile e non si hanno problemi con l'ereditarietà. Ma al momento sono totalmente bloccato.
Sto pensando troppo complicato? Come devo affrontare questo problema?
Certo, devo creare sistemi che sono effettivamente responsabili della "post-collisione", quindi il sistema di collisione dice solo "Sì, abbiamo una collisione nell'ultimo frame" e poi ci sono un sacco di sistemi "post-collisione" che tutti richiedono componenti diversi (combinazioni di) e quindi cambiano i componenti. Ad esempio ci sarebbe un sistema di post-collisione del movimento che blocca le cose che devono fermarsi quando si verifica la collisione. Quindi un sistema di post-collisione fisico che riflette cose, ecc.
Ma questa non sembra nemmeno essere una soluzione adeguata per me, perché ad esempio:
- Il mio sistema di post-collisione del movimento avrebbe bisogno di entità che hanno una componente di posizione, una componente di movimento e una componente di collisione. Quindi imposta la velocità dell'entità su zero.
- Il sistema fisico post-collisione avrebbe bisogno di entità che hanno un componente di posizione, un componente di movimento, un componente di collisione e un componente di fisica. Quindi rifletterebbe il vettore di velocità.
Il problema è ovvio: il movimento post-collisione ha bisogno di entità che sono un sottoinsieme delle entità nel sistema post-collisione di fisica. Quindi due sistemi post-collisione opererebbero sugli stessi dati, con l'effetto: sebbene un'entità abbia una componente fisica, la velocità sarebbe zero dopo una collisione.
Come vengono risolti questi problemi in generale in un sistema di componenti di entità? Quei problemi sono al solito o sto facendo qualcosa di sbagliato? Se sì, cosa e come dovrebbe essere fatto invece?