





























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 |
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.
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.
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.
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)