Benutzer-Werkzeuge

Webseiten-Werkzeuge


godot:node:kollision2d

Kollision/Physik-Objekte

KinematicBody2D Bewegbarer Körper
StaticBody2D Feststehender Körper
RigidBody2D Körper welcher sich auf Grund Physikalischer Kräfte bewegt
Area2D Erkennen, wenn Objekte in den Bereich eindringen
TileMaps Die jeweiligen Kacheln können mit einer Kollisionshülle umgeben werden
Raycast2D Sendet einen Suchstrahl aus und gibt Entfernung und Objekt zurück

Physikalische Kräfte

Projekteinstellungen ⇒ Physics ⇒ 2D

Default Gravity 98 Pixel pro sekunde (Schwerkraft)
Default Gravity Vector (0,1)

Wenn die Bewegung und die Drehung den voreingestellten Wert von

Sleep Threshold Linear (Stecke)
Sleep Threshold Angular (Winkel in Bogenmass)

unterschreiten wird das Objekt in den Schlafmodus versetzt und die physikalischen Berechnungen für dieses Objekt werden pausiert.

Für das Debuggen können wir die Collision Shapes sichtbar machen, die gleichnamige Funktion können wir aus der Menüzeile ⇒ Debuggen aktivieren.

Kollisions-Layer und Masken

Es besteht die Möglichkeit, bestimmte Objekt-Kombinationen aus der Kollisionserkennung heraus zu nehmen. Hierbei finden die Physik-Layer Anwendung.

Inspektor ⇒ PhysicsBody2D ⇒ Collision ⇒ Layer und darunter Mask

Solange alle Objekte (wie zu Beginn) auf Layer 1 und Mask auf 1 liegen, findet unter allen Objekten eine Kollision statt.

Die Idee hinter Layer und Masken besteht darin, Gruppen zu bilden und jeder Gruppe einem Layer zuzuweisen. Über die Maske definieren wir dann, welche Layer zu einer Kollision führen. Gleich vorweg, mit dieser Methode ist es nicht möglich zu bestimmen, Objekt1 mit Objekt2 kollidiert, jedoch Objekt2 mit Objekt 1 nicht!

Um bei dieser Gruppierung nicht durcheinander zu kommen, besteht die Möglichkeit, dem Layer einen Namen zu geben.

Projekteinstellungen ⇒ Layer Names ⇒ 2d Physics

In dieser zweispaltigen Tabelle können die Layer Namen erhalten, diese werden dann im Inspektor entsprechend angezeigt.

Ray-casting (Sichtstrahl)

Eine häufige Fragestellung: kann ich von einer bestimmten Position, ein Objekt sehen oder steht etwas zwischen diesen beiden Punkten?

Die Physik-Engine kann uns mit folgende Skriptzeilen die Antwort liefern:

var space_state = get_world_2d().direct_space_state
var result = space_state.intersect_ray(position,$"../Ziel".position,[self])
print(result.collider.name)  # Name des getroffenen Objektes 
print(result.position)       # Position des Treffers

Die Funktion intersect_ray(StartVec, ZielVec, [Ausgenommene Objekte], collisions_layer)

Vector2 StartVektor
Vector2 ZielVecktor
Array [Ausgenommene Objekte]
int collisions_layer = 2147483647 (Bitmuster alle Layer aktiv)
Dictionary Container mit Werten welche durch Schlüssel referenziert sind

liefert hier ohne zusätzliches Node die Antwort.

Abstand

Um den Abstand zwischen StartVec und dem getroffenen Objekt zu ermitteln, subtrahieren wir beide Vektoren und ermitteln von dem Ergebnis-Vektor die Länge.

	var space_state = get_world_2d().direct_space_state
	var result = space_state.intersect_ray(position,$"../Ziel".position,[self])
	var pos =  result.position - position
	print(pos.length())
	print(result.collider.name)
godot/node/kollision2d.txt · Zuletzt geändert: 2020/10/11 22:48 (Externe Bearbeitung)