Wie erstelle ich eine realistische Kollisionserkennung für 2D-Rollenspiele?

9

Ich wollte schon immer ein altmodisches 2D-Rollenspiel wie Star Ocean, Final Fantasy, Sword of Mana und sogar die "Tales of" -Serie erstellen, und ich denke, viele Leute tun es. Aber bevor ich überhaupt eine einzige Codezeile geschrieben habe, habe ich viel recherchiert, gezeichnet und ausprobiert.

Ich habe fast alle Antworten auf meine Fragen gefunden, aber es gibt ein Problem, das ich nicht lösen konnte: Wie erstellen Sie eine realistische, aber dennoch einfache Kollisionserkennung , wie in den zuvor genannten Spielen?

Ich kenne bereits verschiedene Methoden zur Berechnung der Kollisionserkennung. Sehen Sie sich die folgenden Beispiele an:

Beispiele für Kollisionserkennung

Keines davon befriedigt meine Bedürfnisse.

  • Fliesenbasierte Kollisionen sind viel zu einfach und passen eher zu einem Zelda als zu einem Star Ocean. Außerdem muss die Zeichnung jeder Kachel den gesamten Raum ausfüllen, um realistisch auszusehen.
  • Pixel-perfect hat zu viele Einschränkungen. Wenn Ihre Kachel hier und da einige Pixel hat, bleibt der Spieler höchstwahrscheinlich mitten im Nirgendwo stecken (dh in einigen Spielen bleibt man auf einer 2 Pixel breiten Baumwurzel stecken).
  • Und binäre Masken verbrauchen zu viel Speicher und Einstellungen imo.

Ich habe viel Dokumentation gelesen, aber nie etwas gefunden, das für mich gut aussah. Und alle meine Versuche sahen nicht so aus, wie ich früher gespielt habe. Wenn Sie also gute Links oder Tutorials zur Funktionsweise von 2D-Rollenspielen haben, lassen Sie es mich bitte wissen.

Aymeric
quelle
2
Welche Umgebung entwickeln Sie für diese Kollisionsmasken, die zu viel Speicherplatz beanspruchen? Das ist für die meisten modernen Systeme wirklich kein Problem, und Kollisionsmasken klingen wirklich so, wie Sie es suchen.
Gregory Avery-Weir
Ich entwickle die meiste Zeit mit XNA auf dem PC, aber kürzlich habe ich darüber nachgedacht, ein Projekt auf WP7 zu starten. Das Problem, das ich mit Kollisionsmasken hatte, war, dass es mit einer kleinen Auflösung genau so funktionierte, wie es pixelgenau wäre, indem mein Charakter zum Beispiel in einer Ecke stecken blieb. Wenn Sie also die Bézier-Kurve nicht für reibungslose Bewegungen verwenden, müssen Sie beim Erstellen der Maske sehr vorsichtig sein.
Aymeric

Antworten:

9

Die N Tutorials können hier helfen. Zugegeben, sie sind für einen Plattformspieler im Arcade-Stil gedacht, aber sie funktionieren genauso gut für ein Rollenspiel von oben nach unten. Wende einfach nicht die Schwerkraft an. Die Voraussetzung ist das Testen auf Kollision in einer Sammlung von Grundformen - Kreisen, achsenausgerichteten Begrenzungsrahmen, Linien, Punkten usw.

Sie dekorieren dann entweder Ihre Welt damit (möglicherweise über einen benutzerdefinierten Ebeneneditor) oder generieren sie automatisch (passen Sie eine nächste Box oder einen Kreis an) - oder beides (standardmäßig automatisch generierte Box / Kreis und lassen Sie einen Designer optimieren) .

Wo ich arbeite, haben wir einige Plattformer und einige Top-Down-Erkundungsspiele gemacht. Wir machen sie seit den GBA-Tagen. Wir verwenden AABBs am häufigsten für Charaktere und Objekte, die in einem Sprite-Editor eingestellt werden können - und wir werden hier verrückt und erlauben eine Menge Boxen pro Sprite, einige mit unterschiedlichen Zwecken. Wir haben vielleicht:

  • eine oder mehrere Kollisionsboxen, die die Form des Objekts beschreiben, um auf Dinge zu stoßen;
  • möglicherweise viele "Angriffsboxen", die nur entstehen, wenn Sie sich mitten in einem Angriff befinden (und mit dem Sprite animieren), vielleicht sogar zwei oder drei pro Waffe, je nachdem;
  • Einige "gefährdete Boxen", die Schaden erleiden, wenn sie von den Angriffsboxen anderer getroffen werden. Standardmäßig verwenden wir die Kollisionsbox. Die anfälligen Boxen fühlen sich jedoch besser an, wenn sie kleiner als die Kollisionsbox sind, und wir können dies zulassen für ortsbezogene Schäden auf diese Weise
  • eine oder mehrere "Aktivierungsboxen" auf der KI, die die Erfassungsregion für die KI beschreiben - sie greifen an, wenn sich der Spieler beispielsweise in dieser Region befindet.

Die Ebenen sind meistens Zeichenfolgen von Liniensegmenten; Wir haben ein paar Metadaten pro Segment, um beschädigte oder rutschige Oberflächen usw. zu beschreiben.

Der größte Teil der Kollisionserkennung und -reaktion wird also zu AABB-vs-AABB oder AABB-vs-Segment. Gelegentlich werfen wir einen Kreis gegen etwas für ein Projektil, obwohl oft auch ein AABB dies hier tut.

Sie brauchen nicht viele Grundformen, damit die Dinge gut aussehen und sich gut verhalten - einige reichen aus, vorausgesetzt, Sie können sie optimieren und wiederholen.


Fühlen Sie sich auch nicht schlecht, wenn Sie Systeme miteinander mischen. Eine auf Kacheln basierende Kollision kann in einigen Bereichen (die den größten Teil Ihrer Welt repräsentieren) ausgezeichnet sein, ist jedoch für Objekt-Objekt-Interaktionen schrecklich. Das ist gut; Verwenden Sie ein anderes System für Objekt gegen Objekt! Das Schreiben für Interaktionen zwischen den beiden Systemen ist möglicherweise einfacher als Sie denken.

schlanker
quelle