====== Spielfigur ======
Beginnen wir mit einer einfachen Spielfigur auf einem zweidimensionalen Feld, welche wir mit den Tasten w-a-s-d entsprechend steuern wollen. Bei Hindernissen soll die Spielfigur stehenbleiben und das Hindernis benennen.
Wir benötigen also eine Basis-Node welche sich bewegen lässt. Also ein KinematicBody2D. Diesen finden wir unter:
Node => CanvasItem => Node2D => CollisionsObject2D => PhysicsBody2D => KinematicBody2D
Damit wir diesen Node auch später sehen können, erweitern wir diesen Zweig mit einem Sprite.
Node => CanvasItem => Node2D => Sprite
Dieser Node kann eine Grafik aufnehmen und die wollen wir gleich auswählen.
Im Szene-Baum sollte noch der Node(Sprite) selektiert sein. Im Inspektor suchen wir nun den Parameter Texture mit dem Wert =null.
Aus dem Dateisystem können wir jetzt eine Grafik per Drag&Drop auf eben diesen Wert null ziehen.
----
Nach dem Erstellen eines neuen Projektes erzeugen wir zunächst eine eigene Szene für die Spielfigur.
Als Root-Node nutzen wir ein **KinematicBody2D** um mit der Spielfigur später auf Kollisionen reagieren zu können.
Hierunter legen wir das Node **Sprite**, in das wir im Inspektor unter Sprite => Textur eine Grafik bestimmen. Am einfachsten geht dies indem wir aus dem Dateisystem die entsprechende Datei mit gedrückt gehaltener Maus in das entsprechende Inspektor-Feld ziehen.
Für die Kollision benötigen wir noch ein Node **CollisionsShape2D** mit welchen wir im Inspektor unter CollisionsShape2D => Shape eine Form bestimmen. Diese Form ziehen wir danach auf die Größe des Sprites mit den innen liegenden Anfassern.
Mit dem Button (verhindern der Auswahl von Unterobjekten) aus dem 2D-Fenstermenü verhindern wir ein unterschiedliches Verschieben der jeweiligen Objekte
Als letztes fügen wir dem KinematicBody2D eins der folgenden Skripte zu:
====== Bewegung in X und Y Richtung ======
extends KinematicBody2D
var velocity = Vector2(0, 0)
var x=0
var y=0
func _physics_process(delta):
if Input.is_key_pressed(KEY_W):
y = -50
elif Input.is_key_pressed(KEY_S):
y = 50
else:
y = 0
if Input.is_key_pressed(KEY_D):
x = 50
elif Input.is_key_pressed(KEY_A):
x = -50
else:
x = 0
velocity = Vector2(x, y)
var collision_info = move_and_collide(velocity * delta)
if collision_info:
var objekt = collision_info.collider
print(objekt.get_index())
print(objekt.name)
====== Bewegung in Sichtrichtung ======
extends KinematicBody2D
var dreh_geschw = 1
var schritt_geschw = 100
var drehung = 0
func _process(delta):
var schritt = 0 # muss nach jedem durchlauf = 0 sein
if Input.is_action_pressed("ui_up"):
schritt = schritt_geschw * delta
if Input.is_action_pressed("ui_down"):
schritt = -schritt_geschw * delta
if Input.is_action_pressed("ui_right"):
drehung += dreh_geschw * delta
if Input.is_action_pressed("ui_left"):
drehung += -dreh_geschw * delta
var vec = Vector2(0,schritt).rotated(drehung)
var collision_info = move_and_collide(vec)
if collision_info:
var objekt = collision_info.collider
print(objekt.get_index())
print(objekt.name)
# angabe in bogenmaß 2 * pi = 360°
rotation = drehung
====== Jump & Run ======
extends KinematicBody2D
var motion = Vector2()
const up = Vector2(0,-1)
const gravity = 100
const speed = 200
const jump = -1000
func _physics_process(delta):
if Input.is_action_pressed("ui_right"):
motion.x = speed
elif Input.is_action_pressed("ui_left"):
motion.x = -speed
else:
motion.x = 0
if is_on_floor():
if Input.is_action_pressed("ui_up"):
motion.y = jump
else:
motion.y += gravity
move_and_slide(motion, up)
Über den Richtungsvektor up definieren wir welche Seite einer Kollision ein Auftreffen auf dem Boden(floor) ist. Eine Kollision mit einer Wand kann mit der Funktion is_on_wall() ermittelt werden.
Bei der Funktion move_and_slide() wird bereits intern der delta-Wert eingerechnet.