Benutzer-Werkzeuge

Webseiten-Werkzeuge


godot:syntax:ereignisse

Ereignisse

Als Ereignisse sollen hier jene betrachtet werden, welche wir durch Tastatur, Maus oder Joystick auslösen. Godot behandelt noch weitere Ereignisse, die wir mit vergleichbaren Methoden verarbeiten können.

Action

Um das erstellte Programm für unterschiedliche Geräte (PCs / Tablets) zu verwenden, bietet Godot eine Schnittstelle an, über die eine Eingabe-Zuordnung erzeugt werden kann. Hierbei werden eine oder mehrere Eingaben unter einen Namen zusammengefasst. Hierbei handelt es sich um eine „action“ welche wir neben der oben genannten Eingabegeräte auswerten können.

Input

Die eingehenden Signale können über die Instanz Input abgefragt werden.

func _ready():
	set_process(true)
 
func _process(delta):
	if Input.is_key_pressed(KEY_B):
		print("Taste B")
	if Input.is_action_pressed("dummi"):
		print("Aktion dummi")

Entsprechend den alternativen Eingabegeräten: is_key_pressed(id) is_mouse_button_pressed(id) is_joy_button_pressed(id) is_action_pressed(name)

In der Klasse @GlobalScope sind die entsprechenden id‘s mit Namen versehen. So können wir bei der Tastatur anstatt der id auch KEY_A für die Taste A angeben.

Ereignisgesteuerte Funktionen

Würde man jedoch innerhalb jeden Frames alle Tasten abfragen, würde dies sehr zeitaufwendig sein. Aus diesem Grund verwendet Godot ereignisgesteuerte Funktionen. Diese werden lediglich dann aufgerufen, wenn ein Ereignis vorliegt!

Die Funktion _input wird als erstes Aufgerufen wenn ein Ereignis stattfindet. Am einfachsten lassen sich Eingabe-Zuordnung auswerten:

func _input(event):
	if event.is_action_pressed("dummi"):
		print("Aktion dummi")

Da diese Funktionen von allen Ereignissen ausgelöst werden, können wir zunächst auswerten, welches Eingabegerät das Ereignis ausgelöst hat.

func _input(event):
	if event is InputEventKey:
		print("Taste")
	if event is InputEventMouse:
		print("Maus")
	if event is InputEventMouseButton:
		print("Maustaste")
	if event is InputEventMouseMotion:
		print("Mausbewegung")
	if event is InputEventJoypadButton:
		print("Joytaste")
	if event is InputEventJoypadMotion:
		print("Joystick")

Zwei Punkte stören noch an diesem Skript, zum einen wird beim Betätigen sowie beim Loslassen einer Taste die Funktion aufgerufen. Und zum anderen können wir noch nicht ermitteln, welche Taste das Ereignis ausgelöst hat.

Hier kommt wieder die Klasse @GlobalScope ins spiel mit den Id‘s und dessen Namen

func _input(event):
	if event is InputEventKey:
		if event.pressed and event.scancode == KEY_ESCAPE:
			print("Taste ESC")
	if event is InputEventMouseButton:
		if event.pressed and event.button_index == BUTTON_LEFT:
			print("links")
	if event is InputEventJoypadButton:
		if event.pressed and event.button_index == JOY_BUTTON_0:
			print("Joytaste Button0")
	if event is InputEventMouse:
		#print(event.button_mask)
		#print(event.position)
		#print(event.global_position)
		pass
	if event is InputEventMouseMotion:
		#print(event.relative)
		#print(event.speed)
		pass
	if event is InputEventJoypadMotion:
		#print(event.axis)
		#print(event.axis_value)

Zeitlicher Ablauf:

_input(event)

func _input(event):
	pass

Diese Funktion wird als erstes abgearbeitet sofern diese nicht mit set_process_input(false) deaktiviert wurde. Soll das Event in den folgenden Funktionen nicht wieder ausgelöst werden, kommt diese Funktion zum Einsatz: SceneTree.set_input_as_handled()

GUI

Zweitens wird versucht, die Eingabe an die GUI zu übergeben und zu sehen, ob ein Steuerelement sie empfangen kann. Wenn dies der Fall ist, wird Control über die virtuelle Funktion Control._gui_input () aufgerufen und das Signal „input_event“ wird ausgegeben (diese Funktion kann per Skript durch Erben davon erneut implementiert werden). Wenn das Steuerelement das Ereignis „verbrauchen“ möchte, ruft es Control.accept_event () auf und das Ereignis wird sich nicht mehr ausbreiten. Verwenden Sie die Control.mouse_filter -Eigenschaft, um zu steuern, ob ein Control über Control._gui_input () - Callback über Mausereignisse benachrichtigt wird und ob diese Ereignisse weitergeleitet werden.

Hat hier noch jemand ein Beispiel-Skript/Anwendung?

_unhandled_input(event)

func _unhandled_input(event):
	# anzuwenden wie _input 
	pass
 
func _unhandled_key_input(event):
	# hier kommen nur die Tastatur an
	pass

CollisionObject

Wenn das Ereignis bisher noch nicht gewünscht wurde und dem Viewport eine Kamera zugewiesen wird, wird ein Strahl in die Physikwelt (in Strahlrichtung vom Klick) geworfen. Wenn dieser Strahl auf ein Objekt trifft, ruft er die Funktion CollisionObject._input_event () im entsprechenden Physikobjekt auf (Körper empfangen diesen Callback standardmäßig, Bereiche jedoch nicht. Dies kann über die Eigenschaften des Bereichs konfiguriert werden).

Hat hier noch jemand ein Beispiel-Skript/Anwendung?

godot/syntax/ereignisse.txt · Zuletzt geändert: 2020/10/11 22:48 (Externe Bearbeitung)