Verwenden von Area2D

Einführung

Godot bietet eine Reihe von Kollisionsobjekten an, um sowohl Kollisionserkennung als auch Reaktion zu ermöglichen. Der Versuch zu entscheiden, welches für Ihr Projekt verwendet werden soll, kann verwirrend sein. Sie können Probleme vermeiden und die Entwicklung vereinfachen, wenn Sie verstehen wie sie funktionieren und welche Vor- und Nachteile sie haben. In dieser Anleitung sehen wir uns den Node Area2D an und zeigen einige Beispiele, wie er verwendet werden kann.

Bemerkung

In diesem Dokument wird davon ausgegangen, dass Sie mit den verschiedenen physikalischen Körpern von Godot vertraut sind. Bitte lesen Sie zuerst Physik Einleitung.

Was ist ein Bereich?

Eine Area2D definiert einen Bereich im 2D Raum. Innerhalb dieses Bereichs werden andere CollisionObject2D-Nodes beim ein- und austreten sowie überschneiden erkannt. Diese Bereiche erlauben es auch physikalische Eigenschaften außer Kraft zu setzen. Wir werden auf jede dieser Funktionen genauer eingehen.

Bereichs-Eigenschaften

Bereiche haben viele Eigenschaften, mit denen Sie ihr Verhalten anpassen können.

../../_images/area2d_properties.png

Die ersten acht Eigenschaften werden verwendet, um das physikalische Überschreibungsverhalten des Bereichs zu konfigurieren. Wir werden uns im folgenden Abschnitt ansehen, wie diese verwendet werden.

Monitoring und Monitorable werden verwendet, um den Bereich zu aktivieren und zu deaktivieren.

Im Abschnitt "Collision" konfigurieren Sie die Kollisionsebene(n) und die Maske(n) des Bereichs.

Im Abschnitt "Audiobus" können Sie Audio in dem Bereich überschreiben, um beispielsweise einen Audioeffekt anzuwenden, wenn sich der Spieler hindurch bewegt.

Beachten Sie, dass Area2D CollisionObject2D erweitert, sodass auch Eigenschaften bereitgestellt werden, die von dieser Klasse geerbt wurden, z.B. input_pickable.

Überlagerung erkennen

Möglicherweise werden Area2D-Nodes am häufigsten zur Kontakt- und Überlappungserkennung verwendet. Wenn Sie wissen müssen, ob sich zwei Objekte berührt haben, aber keine physische Kollision benötigt wird, können Sie solch einen Bereich verwenden, um Sie über den Kontakt zu informieren.

Nehmen wir zum Beispiel an, wir machen eine Münze, die der Spieler aufheben kann. Die Münze ist kein festes Objekt (der Spieler kann nicht darauf stehen oder sie schieben) wir möchten nur, dass sie verschwindet, wenn der Spieler sie berührt.

Hier ist das Node-Setup für die Münze:

../../_images/area2d_coin_nodes.png

Um die Überlappung zu erkennen, verbinden wir das entsprechende Signal mit dem Area2d. Welches Signal verwendet werden soll, hängt vom Knotentyp des Spielers ab. Wenn der Spieler ein anderer Bereich ist, verwenden Sie area_entered. Nehmen wir jedoch an, unser Spieler ist ein KinematicBody2D (und daher ein CollisionObject2D-Typ), also verbinden wir das body_entered-Signal.

Bemerkung

Wenn Sie mit der Verwendung von Signalen nicht vertraut sind, finden Sie eine Einführung unter Signale.

extends Area2D

func _on_Coin_body_entered(body):
    queue_free()
public class Coin : Area2D
{

    public void OnCoinBodyEntered(PhysicsBody2D body)
    {
        QueueFree();
    }
}

Jetzt kann unser Spieler die Münzen sammeln!

Weitere nützliche Beispiele:

  • Bereiche eignen sich hervorragend für Kugeln und andere Projektile, die treffen und Schaden verursachen, aber keine andere Physik wie das Abprallen benötigen.
  • Verwenden Sie eine große kreisförmige Fläche um einen Feind, um dessen "Erkennungs"-Radius zu definieren. Wenn sich der Spieler außerhalb des Gebiets befindet, kann der Feind es nicht "sehen".
  • "Überwachungskameras" - Befestigen Sie in einem großen Level mit mehreren Kameras Bereiche an jeder Kamera und aktivieren Sie sie, wenn der Spieler eintritt.

Siehe Das erste Spiel für ein Beispiel eines Spiels, dass Area2D verwendet.

Bereichseinfluss

Die zweite Hauptanwendung für Area-Nodes ist die Veränderung der Physik. Standardmäßig wird der Bereich dies nicht tun, aber Sie können dies mit der Eigenschaft Space Override aktivieren. Wenn sich Bereiche überschneiden, werden sie der Reihe nach entsprechend ihrer Priorität verarbeitet (Bereiche mit höherer Priorität werden zuerst verarbeitet). Es gibt vier Optionen zum Überschreiben:

  • Combine - Der Bereich addiert seine Werte zu den bisher berechneten Werten.
  • Replace - Der Bereich ersetzt physikalische Eigenschaften, und Bereiche mit niedrigerer Priorität werden ignoriert.
  • Combine-Replace - Der Bereich addiert seine Schwerkraft-/Dämpfungswerte zu den bisher berechneten Werten (in Prioritätsreihenfolge), wobei Bereiche mit niedrigerer Priorität ignoriert werden.
  • Replace-Combine - Der Bereich ersetzt die bisher berechnete Schwerkraft/Dämpfung, berechnet jedoch weiterhin den Rest des Bereichs.

Mit diesen Eigenschaften können Sie ein sehr komplexes Verhalten mit mehreren überlappenden Bereichen erstellen.

Die physikalischen Eigenschaften, die überschrieben werden können, sind:

  • Gravity - Die Stärke der Schwerkraft innerhalb des Gebiets.
  • Gravity Vec - Richtung der Schwerkraft. Dieser Vektor muss nicht normalisiert werden.
  • Linear Damp - Wie schnell sich Objekte nicht mehr bewegen - lineare Geschwindigkeit pro Sekunde verlieren.
  • Angular Damp - Wie schnell sich Objekte nicht mehr drehen - Winkelgeschwindigkeit pro Sekunde verlieren.

Punktgravitation

Mit der Eigenschaft Gravity Point können Sie einen "Attraktor" erstellen. Die Schwerkraft in dem Gebiet wird in Richtung eines Punktes berechnet, der durch die Eigenschaft Gravity Vec angegeben wird. Die Werte beziehen sich auf Area2D, beispielsweise werden durch (0, 0) Objekte in die Mitte des Bereichs gezogen.

Beispiele

Das unten angehängte Beispielprojekt enthält drei Bereiche, in denen die Außerkraftsetzung der Physik demonstriert wird.

../../_images/area2d_override.gif

Das Projekt steht hier zum download bereit: using_area_2d.zip