Benutzer-Werkzeuge

Webseiten-Werkzeuge


godot:node:kinematicbody2d

KinematicBody2D

Mit diesem Körper können Kollisionen ermittelt werden. Kräfte wirken hierauf jedoch nicht. Im Szenen-Baum gehört zum KinematicBody2D noch ein Node mit dem wir den Korper sichtbar machen.

Wir verwenden hier ein Sprite, welches wir ein Bild im Inspektor⇒Sprite⇒Texture zuordnen.

Der KinematicBody2D benötigt noch ein Node für die Kollisionsform, wir verwenden hier ein CollisionShape2D. Im Inspektor⇒ CollisionShape2D⇒Shape wählen wir eine geeignete Form aus und skalieren diese auf die Größe vom Sprite, im 2D-Editor.

Wenn wir im Szenenbaum KinematicBody2D selektiert haben, empfiehlt es sich im 2D-Editor den folgenden Button zu betätigen, wodurch verhindert wird, dass untergeordnete Objekte selektiert werden können.

Ein Verschieben des Sprites, weg von dem KinematicBody2D ist dadurch nicht möglich.

Jegliche Bewegung muss mittels Skript erfolgen. Um dem KinematicBody2D ein Skript zuzuordnen, selektieren wir zunächst den KinematicBody2D im Szenenbaum und drücken anschließend auf den Button „Skript hinzufügen“.

Bevor Godot Kollisions- oder Physik-Objekte intern berechnet, wird im jeweiligen Skript die Funktion

func _physics_process(delta):

sofern vorhanden abgearbeitet. Wir sollten also jegliche Bewegung des Objektes von hier aus starten.

Der von dieser Funktion erhaltene Wert delta entspricht der vergangenen Zeit, seit dessen letzten Aufruf. Durch die Multiplikation dieses Wertes mit der Bewegung des Objektes, bleibt die Geschwindigkeit konstant.

Der Körper sollte nicht direkt durch Setzen des Parameters Node2D⇒Transform⇒ Position bewegt werden, sondern über folgende Funktionen erfolgen:

move_and_collide

KinematicCollision2D = move_and_collide(Vector2 * delta)

Dieser Funktion übergeben wir lediglich einen Vektor welcher Richtung und Länge der zurückzulegenden Strecke enthält. Im Falle einer Kollision erhalten wir ein KinematicCollision2D zurück. Die Bewegung wird abgebrochen, wodurch die Körper nicht ineinandergeschoben werden. Die noch fehlende Strecke kann beispielsweise für einen Abprall weiterverwendet werden.

func _physics_process(delta):
    var CollisionObjekt = move_and_collide(velocity * delta)
    if CollisionObjekt:
        velocity = velocity.bounce(CollisionObjekt.normal)

Das Kollisionsobjekt enthält Informationen über die Kollision, einschließlich des kollidierenden Objekts, der verbleibenden Bewegung und der Kollisionsposition.

move_and_slide

CoveredTrack = move_and_slide (linear_velocity,
	floor_normal=Vector2( 0, 0 ), 
	slope_stop_min_velocity=5,
	int max_bounces=4,
	float floor_max_angle=0.785398 )

Das Objekt gleitet im Fall einer Kollision an dessen Fläche entlang

linear_velocity(Vector2)
Hierbei handelt es sich um den Richtungsvektor, wohin unser Objekt sich bewegen soll. Die Funktion move_and_slide berechnet intern bereits den Delta-Wert mit ein, insofern darf der Bewegungsvektor nicht mit diesem Wert verrechnet werden.

floor_normal(Vector2)
dieser Vektor bestimmt die Richtung des Bodens (normalerweise 0,-1).

Über die Funktionen

is_on_floor()	# Boden
is_on_wall()	# Seitenwände
is_on_ceiling()	# Decke

kann so bei einer Kollision ermittelt werden, ob es sich um den Boden, Wand oder Zimmerdecke handelt.

slope_stop_min_velocity(float)
Dies ist die Mindestgeschwindigkeit beim Stehen am Hang. Dies verhindert, dass ein Körper beim Stehen den Hang hinunterrutscht.

max_bounces(int)
Dies ist die maximale Anzahl an Kollisionen, bevor der Körper aufhört sich zu bewegen. Wenn Du diesen Wert zu niedrig einstellst, kann dies die Bewegung vollständig verhindern.

floor_max_angle(float)
Dies ist der maximale Winkel, bevor eine Oberfläche nicht länger als „Boden“ betrachtet wird.

CoveredTrack(Vector2)
Die Funktion gibt den Vektor der zurückgelegten Strecke zurück.

var richtung = Vector2(50,50)
 
func _physics_process(delta):
	richtung = move_and_slide(richtung)	# ändert "richtung" im Fall einer Kollision
godot/node/kinematicbody2d.txt · Zuletzt geändert: 2020/10/11 22:48 (Externe Bearbeitung)