Il commento di Robert Harvey sull'emissione di un cerchio dal centro per approssimare la forma era buono. In alternativa puoi usare rettangoli / triangoli su una superficie 2D, come nel gioco, o un prisma rettangolare / equivalente triangolare in un ambiente 3D. Puoi anche dividere ciascuna delle tue forme in una raccolta di queste forme più piccole per approssimare la forma reale su una scala più fine (usando forme ellittiche o con bordi dritti), e questo è fondamentalmente il modo in cui un sacco di giochi pesanti per CPU funzionano nel modo più efficiente lo fanno.
Detto questo, potresti far sì che tutti questi oggetti estendano la stessa classe base. Quindi in quella classe, ci sarebbe un metodo / proprietà overridable chiamato getCollisionComponentShapes
, che restituirebbe un array o ArrayList
delle forme. Queste sarebbero le forme ellittiche, i rettangoli e / oi triangoli menzionati in precedenza che verrebbero usati per approssimare il poligono. Ciò riduce tutto, diciamo, a tre funzioni, assumendo che tu ti limiti a seguire le forme a bordi rettilinei:
detectCollisionReRe(pRect1:Rectangle, pRect2:Rectangle):Boolean
detectCollisionReTr(pRect1:Rectangle, pTri2:Triangle):Boolean
detectCollisionTrTr(pTri1:Triangle, pTri2:Triangle):Boolean
Quindi nella tua classe base, ci sarebbe un metodo presumibilmente statico:
detectCollisionShapes(pBaseClassRef1:BaseClass, pBaseClassRef2:BaseClass):Boolean
e questo dovrebbe solo scorrere attraverso le forme di collisione di ogni istanza ed eseguire una delle tre funzioni sopra per ciascuna combinazione.
Questo sarebbe un grande modo per gestire il caso generale. Nel tuo gioco di geometria, consiglierei di andare avanti e di usare una sorta di forma ellittica generica con curvatura variabile per i tuoi componenti, oltre a rettangoli e triangoli. Anche con la curvatura variabile, puoi utilizzare la matematica a livello di secondo livello e questo porterà solo l'elenco fino a sei funzioni.
Come nota a margine, probabilmente non avresti bisogno di questo nel tuo gioco, ma se stavi progettando un gioco AAA, potrebbe essere utile cercare modi per memorizzare i risultati e tagliare gli angoli in altri modi.