Quali passi verrebbero coinvolti nella costruzione di un paesaggio 2D distruttibile, come in Worms? Idealmente, quali sono alcuni modi in cui questo processo potrebbe essere reso il più efficiente possibile?
Quali passi verrebbero coinvolti nella costruzione di un paesaggio 2D distruttibile, come in Worms? Idealmente, quali sono alcuni modi in cui questo processo potrebbe essere reso il più efficiente possibile?
Risposte:
Non so come il paesaggio nei worm sia stato implementato esattamente, ma sono abbastanza sicuro che abbiano usato una bitmap per il paesaggio (almeno nei vecchi giochi della serie).
Un approccio molto semplice sarebbe un'immagine bitmap (B / N) in cui i pixel neri rappresentano l' aria e i pixel bianchi rappresentano il suolo . La distruzione del paesaggio può essere eseguita facilmente utilizzando le operazioni pixel. Quindi se un razzo colpisce il suolo, dipingi un cerchio nero con radius = blastRadius
nel punto di impatto.
Puoi quindi rendere il tuo mondo (o solo una parte di esso) usando quella bitmap. Per prestazioni migliori, ti suggerisco di implementarlo in un modo, che puoi aggiornare / renderizzare solo una parte del "mondo". Per esempio. se alcune parti del paesaggio vengono distrutte da un razzo, ridigita le aree interessate, non il mondo intero.
Invece di un'immagine in bianco e nero come "mappa di collisione", puoi anche utilizzare un'immagine a 24 bit in cui usi due canali per memorizzare la superficie normale (x, y) per pixel e un canale per memorizzare la "collisione- effettiva" carta geografica". Avere a portata di mano la normale superficie ti aiuterà notevolmente a calcolare le granate che rimbalzano o a determinare se un personaggio può muoversi in una determinata direzione.
Una possibilità al di sopra della mia testa:
Utilizzare una rappresentazione del percorso di grafica vettoriale per memorizzare il contorno della "terra" distruttibile. Quando si verifica un evento di distruzione (ad esempio, una granata si spegne), l'area dell'esplosione, rappresentata da un cerchio, verrebbe rimossa dal percorso terrestre tramite un'operazione di sottrazione booleana. Il percorso risultante rappresenta la nuova "terra" per il rilevamento delle collisioni del terreno, e forse anche una maschera per disegnare la terra.
Ho scritto una prova del concetto che ha usato la geometria solida costruttiva per gestire terreni distruttibili. Ho usato il tessellatore GLU per eseguire le operazioni booleane. La documentazione spiega come, cercare "CSG Uses for Winding Rules" .
Ho alimentato l'output triangolare del tassellatore come poligoni statici in Box2D. Il PoC ha funzionato abbastanza bene. Sono stato in grado di sottrarre e aggiungere arbitrariamente terreno in tempo reale e il terreno ha continuato a comportarsi in modo appropriato con Box2D. L'unico vero inconveniente è stato che il tassellatore GLU è in grado di produrre triangoli degeneri che a Box2D non piacciono, quindi ho dovuto filtrarli manualmente.
Il passo successivo nel PoC (che non ho mai avuto a che fare) è stato usare l' algoritmo SCC dalla libreria dei grafici boost per rilevare quando un pezzo di terreno era stato reciso (tagliare la cima da una montagna). Il terreno reciso sarebbe ancora distruttibile ma ora rappresentato da un corpo Box2D dinamico (non statico) con i triangoli attaccati come forme. Ho avuto il progetto elaborato ma ho perso interesse una volta che ho iniziato a scavare nella documentazione boost. I "piano" per rivisitare l'idea quando faccio una terra / Worms bruciata gioco un giorno.
Tutte le risposte sopra parlano dell'implementazione del caso più semplice, come nei worm. Cioè, quando l'area di impatto viene distrutta e tutto il resto non viene toccato. Hai considerato che il tuo paesaggio alla fine potrebbe essere diviso in due? Dì, c'è una montagna, ei giocatori ne tagliano il fondo con un lanciarazzi. Ora, la montagna non dovrebbe cadere? Inoltre, sarebbe naturale che un paesaggio fosse un po 'elastico. Ai tempi di Worms (almeno per quanto mi ricordi, non giocavo a Worms per molti anni) i computer non erano abbastanza forti per farlo bene. Ma lo sono adesso.
Naturalmente, dipende totalmente dalle ambizioni del tuo progetto. Ma se vuoi che sia davvero fantastico, forse dovresti provare Box2D come motore fisico. C'è molto che puoi farci.
Come ha detto bummzack Bitmap. Anche se potresti usare lucidi a 1 bit o se non hai quel supporto usa un orribile colore rosa che non userai nel tuo gioco.
Il punto di impatto può essere calcolato semplicemente controllando il colore dei pixel. e quando si verifica un impatto, cambia il colore (o eliminalo) della bitmap.
Per quanto riguarda il raggio di esplosione, la mia prima fermata sarebbe l'algoritmo del cerchio di Bresenham , molto veloce ed efficiente. Anche se prima farei una cancellazione rought con qualcosa di simile a un quadrato e metterei il cerchio attorno per ottenere i bordi.