Implementazione di un paesaggio distruttibile 2D (come Worms)


76

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?


7
Ottima domanda Worms ha due sfide: la distruttibilità e anche il movimento su angoli strani.
ashes999

penso che questo sia stato chiesto qui diverse volte
Vishnu il

2
Vish, i collegamenti correlati non sembrano suggerirlo.
Il comunista Duck il

3
Puoi controllare come è fatto in Hedgewars : è il clone di Worms opensource.
GvS

Non abbastanza per una risposta, ma potresti voler dare un'occhiata anche a Clonk . È un vecchio gioco 2D di uno sviluppatore tedesco che aveva anche paesaggi distruttibili, fino a pixel specifici. Non è più in fase di sviluppo, ma il codice sorgente è disponibile sotto il link sopra. C'è anche il successore open source OpenClonk, ma dai video sembra essersi allontanato dalla distruzione perfetta dei pixel e ha preso una svolta in una direzione terrestre con tipi di blocchi che possono essere distrutti.
Christian,

Risposte:


47

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 = blastRadiusnel 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.


3
Memorizzare informazioni extra è che la mappa delle collisioni è una bella idea.
deft_code

6

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.


2
Penso che sia così che fa Hedgewars. @Bill, potresti dargli un'occhiata, dato che è opensource.
Gastón,

2
@ Gastón Le mappe in Hedgewars sono tutte immagini (PNG). Dubito che vengano convertiti in grafica vettoriale. Inoltre: l'utilizzo della grafica vettoriale (spline, bezier, ecc.) È molto più pesante per la CPU per cose come il rilevamento delle collisioni o la sottrazione di forme. Guardare la fonte è comunque una buona idea (anche se lo stile di programmazione è piuttosto negativo :))
bummzack

4
Geometria computazionale come questa può diventare MOLTO complicata, MOLTO veloce!
Adam Harte,

Google "terreno distruttibile box2d" ora offre alcune demo vettoriali eseguibili.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

6

Usa geometria solida costruttiva

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.


5

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.


3
Nei worm potresti scavare un buco nel paesaggio usando una torcia. Non sarebbe così divertente se quel tunnel crollasse sul tuo povero verme che brandisce la torcia. Era anche possibile avere pezzi del paesaggio "fluttuanti" nell'aria. La tua proposta sembra un'idea divertente, ma non un gioco Worms.
Bummzack,

Questo era il punto, pensavo alle variazioni di quel gameplay. Inoltre, alcune parti del paesaggio potrebbero essere indistruttibili e / o permanentemente sospese in aria, il che ti permetterebbe di creare blocchi "galleggianti". Inoltre, alcuni potrebbero avere una forza costante applicata a loro, tirandoli verso l'alto o lateralmente, come quello che facevano le palle d'aria nel Mondo di Goo.
Septagram,

È divertente perché in realtà stavo prendendo in considerazione l'idea di creare un gioco come questo, sarebbe stata una svolta divertente per la meccanica di Worms. L'idea di corpi rigidi bitmap sarebbe sicuramente un argomento interessante in sé, la complessità è un po 'sopra la mia testa.
William Casarin,

Bene, in questo caso i corpi rigidi bitmap sarebbero inutili, invece, farei un paesaggio come una griglia triagonale di vertici, collegati elasticamente. Hai giocato a world of goo? In caso contrario, consultare gli screenshot: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . No, no, no, no, se non l'hai giocato, devi assolutamente :) Ora immagina che invece di palle appiccicose ogni triangolo mostri parte della trama del tuo paesaggio, e sono molto più piccoli. Giocherellare con costanti e il tuo paesaggio sarà o piuttosto duro, o morbido come una gelatina
Septagram

2
dai un'occhiata al motore fisico . L'intero motore si basa sull'idea che tutto è un reticolo deformabile / distruttibile (come una torre di sostanza appiccicosa).
deft_code

3

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.