Implementieren einer zerstörbaren 2D-Landschaft (wie Worms)
76
Welche Schritte wären erforderlich, um eine zerstörbare 2D-Landschaft wie in Worms zu erstellen? Idealerweise: Wie kann dieser Prozess so effizient wie möglich gestaltet werden?
Hervorragende Frage. Worms hat zwei Herausforderungen: Zerstörbarkeit und Bewegung in seltsamen Winkeln.
Asche999
Ich denke, das wurde hier schon mehrmals gefragt
Vishnu
2
Vish, die verwandten Links scheinen das nicht nahezulegen.
Die kommunistische Ente
3
Sie können überprüfen, wie es in Hedgewars gemacht wird - es ist ein Open Source Worms-Klon.
GvS
Nicht genug für eine Antwort, aber vielleicht möchten Sie auch Clonk ausprobieren . Es ist ein älteres 2D-Spiel eines deutschen Entwicklers, dessen Landschaft bis auf bestimmte Pixel zerstört werden konnte. Es ist nicht mehr in der Entwicklung, aber der Quellcode ist unter dem obigen Link verfügbar. Es gibt auch den Open-Source-Nachfolger OpenClonk, aber von den Videos scheint er von der pixelgenauen Zerstörung abgewichen zu sein und hat eine Terrarien-ähnliche Richtung eingeschlagen, mit Arten von Blöcken, die zerstört werden können.
Christian
Antworten:
47
Ich weiß nicht genau, wie die Landschaft in Würmern implementiert wurde, aber ich bin mir ziemlich sicher, dass sie eine Bitmap für die Landschaft verwendet haben (zumindest in den älteren Spielen der Serie).
Ein sehr grundlegender Ansatz wäre ein Bitmap-Bild (B / W), bei dem schwarze Pixel Luft und weiße Pixel Boden darstellen . Die Zerstörung der Landschaft kann leicht mit Pixeloperationen erfolgen. Wenn also eine Rakete auf den Boden trifft, malen Sie radius = blastRadiusam Aufprallpunkt einen schwarzen Kreis .
Sie können dann Ihre Welt (oder nur einen Teil davon) mit dieser Bitmap rendern. Für eine bessere Leistung schlage ich vor, dass Sie es so implementieren, dass Sie nur einen Teil der "Welt" aktualisieren / rendern können. Z.B. Wenn einige Teile der Landschaft durch eine Rakete zerstört werden, rendern Sie einfach die betroffenen Gebiete und nicht die ganze Welt neu.
Anstelle eines Schwarzweißbilds als "Kollisionskarte" können Sie auch ein 24-Bit-Bild verwenden, in dem Sie die Oberflächennormale (x, y) pro Pixel über zwei Kanäle und die tatsächliche "Kollisionskarte" über einen Kanal speichern. Karte". Wenn Sie die Oberflächennormale zur Hand haben, können Sie Springgranaten berechnen oder feststellen, ob sich ein Charakter in eine bestimmte Richtung bewegen kann.
Zusätzliche Informationen zu speichern ist eine schöne Idee.
deft_code
6
Eine Möglichkeit, die mir aus dem Kopf geht:
Verwenden Sie eine Vektorgrafik-Pfaddarstellung zum Speichern des Umrisses des zerstörbaren "Landes". Wenn ein Zerstörungsereignis eintritt (z. B. eine Granate abgefeuert wird), wird der als Kreis dargestellte Explosionsbereich über eine boolesche Subtraktionsoperation vom Landweg entfernt. Der resultierende Pfad repräsentiert das neue "Land" für die Bodenkollisionserkennung und möglicherweise auch eine Maske zum Zeichnen des Landes.
Ich denke, so macht es Hedgewars. @Bill, du könntest es dir ansehen, da es OpenSource ist.
Gastón
2
@ Gastón Die Karten in Hedgewars sind alle Bilder (PNGs). Ich bezweifle, dass sie in Vektorgrafiken umgewandelt werden. Außerdem: Die Verwendung von Vektorgrafiken (Splines, Bezier usw.) ist für Dinge wie die Kollisionserkennung oder das Subtrahieren von Formen viel rechenintensiver. Ein Blick auf die Quelle ist allerdings eine gute Idee (obwohl der Codierungsstil eher schlecht ist :))
bummzack
4
Berechnungsgeometrie wie diese kann SEHR kompliziert werden, SEHR schnell!
Adam Harte
Das googeln von "box2d destructible terrain" bietet nun einige lauffähige Vektordemos.
Ciro Santilli am
6
Verwenden Sie eine konstruktive Volumengeometrie
Ich habe einen Proof-of-Concept geschrieben, bei dem mit konstruktiver fester Geometrie zerstörbares Gelände bewältigt wurde. Ich habe den GLU-Tessellator verwendet, um die booleschen Operationen auszuführen. In der Dokumentation wird erläutert, wie Sie nach "CSG-Verwendungen für Wicklungsregeln" suchen .
Ich habe die Dreiecksausgabe des Tessellators als statische Polygone in Box2D eingespeist. Der PoC hat ganz gut funktioniert. Ich konnte in Echtzeit willkürlich Gelände subtrahieren und hinzufügen, und das Gelände verhielt sich mit Box2D weiterhin angemessen. Das einzig wahre Problem war, dass der GLU-Tessellator degenerierte Dreiecke erzeugen kann, die Box2D nicht mag. Deshalb musste ich diese von Hand herausfiltern.
Der nächste Schritt im PoC (an dem ich nie vorbeikam) war die Verwendung des SCC- Algorithmus aus der Boost-Graph- Bibliothek, um zu erkennen, wann ein Stück des Geländes abgetrennt wurde (die Spitze von einem Berg abschneiden). Das abgetrennte Gelände wäre immer noch zerstörbar, wird jedoch jetzt durch einen dynamischen (nicht statischen) Box2D-Körper dargestellt, an dem die Dreiecke als Formen angebracht sind. Ich hatte das Design ausgearbeitet, verlor aber das Interesse, als ich anfing, mich mit der Boost-Dokumentation zu befassen. Ich "plane" , die Idee zu überdenken, wenn ich eines Tages ein Spiel mit verbrannter Erde und Würmern mache.
Alle obigen Antworten beziehen sich auf die Implementierung des einfachsten Falls wie bei Würmern. Das heißt, wenn der Aufprallbereich zerstört wird und alles andere unberührt bleibt. Wussten Sie, dass Ihre Landschaft möglicherweise in zwei Teile geteilt wird? Sagen wir, es gibt einen Berg und die Spieler schneiden den Boden mit einem Raketenwerfer ab. Sollte der Berg nicht fallen? Es wäre natürlich, wenn eine Landschaft ein wenig elastisch wäre. Zu Zeiten von Worms (zumindest, wenn ich mich recht erinnere, habe ich viele Jahre lang keine Worms gespielt) waren Computer nicht gerade stark genug, um es richtig zu machen. Aber das sind sie jetzt.
Natürlich kommt es ganz auf die Ambitionen Ihres Projekts an. Aber wenn Sie wollen, dass es wirklich großartig wird, sollten Sie vielleicht Box2D als Physik-Engine ausprobieren . Damit kann man viel anfangen.
Bei Würmern konnte man mit einer Fackel ein Loch durch die Landschaft graben. Wäre nicht so lustig, wenn dieser Tunnel nur auf Ihrem armen Fackelwurm zusammenbrechen würde. Es war auch möglich, Teile der Landschaft in der Luft "schweben" zu lassen. Ihr Vorschlag klingt nach einer unterhaltsamen Idee, nur nicht nach einem Worms-Spiel.
Mistzack
Das war der springende Punkt, ich dachte über Variationen des Gameplays nach. Außerdem können einige Teile der Landschaft unzerstörbar und / oder dauerhaft in der Luft schwebend sein, wodurch Sie "schwebende" Blöcke erzeugen könnten. Manche könnten auch eine konstante Kraft auf sie ausüben und sie nach oben oder zur Seite ziehen, wie es Luftkugeln in der Welt von Goo taten.
Septagram
Es ist lustig, weil ich tatsächlich darüber nachgedacht habe, ein Spiel wie dieses zu machen. Es wäre eine lustige Wendung für den Worms-Mechaniker. Die Idee von starren Bitmap-Körpern wäre auf jeden Fall ein interessantes Thema für sich, die Komplexität ist mir allerdings ein bisschen zu groß.
William Casarin
Nun, in diesem Fall wären starre Bitmap-Körper ein No-Go. Stattdessen würde ich eine Landschaft als dreieckiges Gitter von Scheitelpunkten erstellen, die elastisch verbunden sind. Hast du schon World of Goo gespielt? Wenn nicht, sehen Sie sich die Screenshots an: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . Nein, nein, nein, nein, wenn Sie es nicht gespielt haben, müssen Sie es unbedingt :) Stellen Sie sich jetzt vor, dass anstelle von Goo Balls jedes Dreieck einen Teil Ihrer Landschaftsstruktur aufweist und diese viel kleiner ist. Spielen Sie mit Konstanten und Ihre Landschaft wird entweder ziemlich hart oder weich wie ein Gelee sein
Septagram
2
Schauen Sie sich die Physical Engine an . Der gesamte Motor basiert auf der Idee, dass alles ein deformierbares / zerstörbares Gitter ist (wie ein Turm aus Gänsehaut).
deft_code
3
Wie gesagt, Bitmaps. Obwohl Sie 1-Bit-Transparenzen verwenden könnten oder wenn Sie diese Unterstützung nicht haben, verwenden Sie eine schreckliche rosa Farbe, die Sie in Ihrem Spiel nicht verwenden.
Der Auftreffpunkt kann berechnet werden, indem nur die Pixelfarbe überprüft wird. und wenn ein Aufprall eintritt, ändern Sie die Farbe (oder löschen Sie sie) der Bitmap.
Was den Explosionsradius angeht, wäre mein erster Stopp Bresenhams Kreisalgorithmus , sehr schnell und effizient. Obwohl ich zuerst einen Gedankenstrich mit einem Quadrat löschen und den Kreis darum legen würde, um die Kanten zu erhalten.
Antworten:
Ich weiß nicht genau, wie die Landschaft in Würmern implementiert wurde, aber ich bin mir ziemlich sicher, dass sie eine Bitmap für die Landschaft verwendet haben (zumindest in den älteren Spielen der Serie).
Ein sehr grundlegender Ansatz wäre ein Bitmap-Bild (B / W), bei dem schwarze Pixel Luft und weiße Pixel Boden darstellen . Die Zerstörung der Landschaft kann leicht mit Pixeloperationen erfolgen. Wenn also eine Rakete auf den Boden trifft, malen Sie
radius = blastRadius
am Aufprallpunkt einen schwarzen Kreis .Sie können dann Ihre Welt (oder nur einen Teil davon) mit dieser Bitmap rendern. Für eine bessere Leistung schlage ich vor, dass Sie es so implementieren, dass Sie nur einen Teil der "Welt" aktualisieren / rendern können. Z.B. Wenn einige Teile der Landschaft durch eine Rakete zerstört werden, rendern Sie einfach die betroffenen Gebiete und nicht die ganze Welt neu.
Anstelle eines Schwarzweißbilds als "Kollisionskarte" können Sie auch ein 24-Bit-Bild verwenden, in dem Sie die Oberflächennormale (x, y) pro Pixel über zwei Kanäle und die tatsächliche "Kollisionskarte" über einen Kanal speichern. Karte". Wenn Sie die Oberflächennormale zur Hand haben, können Sie Springgranaten berechnen oder feststellen, ob sich ein Charakter in eine bestimmte Richtung bewegen kann.
quelle
Eine Möglichkeit, die mir aus dem Kopf geht:
Verwenden Sie eine Vektorgrafik-Pfaddarstellung zum Speichern des Umrisses des zerstörbaren "Landes". Wenn ein Zerstörungsereignis eintritt (z. B. eine Granate abgefeuert wird), wird der als Kreis dargestellte Explosionsbereich über eine boolesche Subtraktionsoperation vom Landweg entfernt. Der resultierende Pfad repräsentiert das neue "Land" für die Bodenkollisionserkennung und möglicherweise auch eine Maske zum Zeichnen des Landes.
quelle
Verwenden Sie eine konstruktive Volumengeometrie
Ich habe einen Proof-of-Concept geschrieben, bei dem mit konstruktiver fester Geometrie zerstörbares Gelände bewältigt wurde. Ich habe den GLU-Tessellator verwendet, um die booleschen Operationen auszuführen. In der Dokumentation wird erläutert, wie Sie nach "CSG-Verwendungen für Wicklungsregeln" suchen .
Ich habe die Dreiecksausgabe des Tessellators als statische Polygone in Box2D eingespeist. Der PoC hat ganz gut funktioniert. Ich konnte in Echtzeit willkürlich Gelände subtrahieren und hinzufügen, und das Gelände verhielt sich mit Box2D weiterhin angemessen. Das einzig wahre Problem war, dass der GLU-Tessellator degenerierte Dreiecke erzeugen kann, die Box2D nicht mag. Deshalb musste ich diese von Hand herausfiltern.
Der nächste Schritt im PoC (an dem ich nie vorbeikam) war die Verwendung des SCC- Algorithmus aus der Boost-Graph- Bibliothek, um zu erkennen, wann ein Stück des Geländes abgetrennt wurde (die Spitze von einem Berg abschneiden). Das abgetrennte Gelände wäre immer noch zerstörbar, wird jedoch jetzt durch einen dynamischen (nicht statischen) Box2D-Körper dargestellt, an dem die Dreiecke als Formen angebracht sind. Ich hatte das Design ausgearbeitet, verlor aber das Interesse, als ich anfing, mich mit der Boost-Dokumentation zu befassen. Ich "plane" , die Idee zu überdenken, wenn ich eines Tages ein Spiel mit verbrannter Erde und Würmern mache.
quelle
Alle obigen Antworten beziehen sich auf die Implementierung des einfachsten Falls wie bei Würmern. Das heißt, wenn der Aufprallbereich zerstört wird und alles andere unberührt bleibt. Wussten Sie, dass Ihre Landschaft möglicherweise in zwei Teile geteilt wird? Sagen wir, es gibt einen Berg und die Spieler schneiden den Boden mit einem Raketenwerfer ab. Sollte der Berg nicht fallen? Es wäre natürlich, wenn eine Landschaft ein wenig elastisch wäre. Zu Zeiten von Worms (zumindest, wenn ich mich recht erinnere, habe ich viele Jahre lang keine Worms gespielt) waren Computer nicht gerade stark genug, um es richtig zu machen. Aber das sind sie jetzt.
Natürlich kommt es ganz auf die Ambitionen Ihres Projekts an. Aber wenn Sie wollen, dass es wirklich großartig wird, sollten Sie vielleicht Box2D als Physik-Engine ausprobieren . Damit kann man viel anfangen.
quelle
Wie gesagt, Bitmaps. Obwohl Sie 1-Bit-Transparenzen verwenden könnten oder wenn Sie diese Unterstützung nicht haben, verwenden Sie eine schreckliche rosa Farbe, die Sie in Ihrem Spiel nicht verwenden.
Der Auftreffpunkt kann berechnet werden, indem nur die Pixelfarbe überprüft wird. und wenn ein Aufprall eintritt, ändern Sie die Farbe (oder löschen Sie sie) der Bitmap.
Was den Explosionsradius angeht, wäre mein erster Stopp Bresenhams Kreisalgorithmus , sehr schnell und effizient. Obwohl ich zuerst einen Gedankenstrich mit einem Quadrat löschen und den Kreis darum legen würde, um die Kanten zu erhalten.
quelle