Godot Szene Methode wird zu Button nicht angezeigt?

paaauleee  22.08.2023, 03:36

Poste mal deinen Code - vllt kann man dann besser sehen, woran es hakt - und...verwendest du Godot 3.x oder 4.x? - da hat sich einiges verändert

Gamer4214 
Fragesteller
 22.08.2023, 12:39

es geht um eine pause funktion bei der tase escape.

Einmal escape pause + pause screen. 2x Escape resume. Godot 4 nutze ich.

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

ich habe es selber mal getestet - einen Button erstellt, und bei nem Input (Esc) soll das Signal "press" ausgegeben werden - dann eine Funktion geschrieben und den ganzen Spaß in der _process() "verbunden" - hat bei mir problemlos hingehauen - befindet sich die Funktion, die ausgeführt werden soll im selben Script.gd - wenn nicht, muss du den Pfad vom Node, wo die Funktion hinterlegt ist, noch angeben

Aber um wenn es ne reine Taste ist, die gedrückt werden soll - kannste auch einfach nen _unhandled_input(event) verwenden, und darüber die Funktion aufrufen oder direkt da rein schreiben - dann musste dich nicht mit Signalen rumärgern

Gamer4214 
Fragesteller
 23.08.2023, 12:35

nene da geht es um ein Spiel. Das ist ja das Problem. das doppelt escape macht es immer unmittelbar.

wenn ich dem charakter die pause funktion gebe und , dann geht es, das unpausieren hingegen ist immer das riesen problem.

ich hatte eine node in die world gesetzt, die dann das spiel unpausieren soll.

versuch 1:

also if player press key escape :

pause

if player press escape and pause == true:

unpause

versuch 2:

pauseactivate node:

if player press key escape :

pause

await pauseactivate (node)

if player press escape and pause == true:

unpause

ich hatte noch einen dritten Versuch, der auch relativ ähnlich wie diese

beiden ist, nur das die node pauseactivate und pausedeactivate existierte.

Es hat keine der Versuchen geklappt. Meist passierte gar nichts. Manchmal lies sich das game nur pausieren, nicht unpausieren.

aus yt hatte ich auch noch eine möglichkeit ausprobiert. diese wo man nodes als autostart hinzufügen kann,

die hat bei godot 4.0 nicht geklappt, weil die methode nicht existierte. Diese möglichkeit glaube ich gibt es nur bei godot 3 .

🤔

0
Gamer4214 
Fragesteller
 23.08.2023, 12:39
@Gamer4214

bei versuch 2 steht dieser teil im "player"

await pauseactivate (node)

if player press escape and pause == true:

unpause

0
paaauleee  24.08.2023, 02:27
@Gamer4214

OK - ich habe die Pausensache mal bei mir getestet - ich habe oben ne Variable "pause : bool = false" hinterlegt.

Dann ein _unhandled_input(event):

if event.is_action_pressed("ESC") and pause == false:
set_process(false)
pause = true

elif event.is_action_pressed("ESC") and pause == true:
set_process(true)
pause = false

klappt bei mir problemlos - habe letztens in nem YT Video mal ne ähnliche Herangehensweise, allerding mit Negation gesehen - war deutlich eleganter gelöst - aber das hier funktioniert auch

was steht in deiner Pausenfunktion drin?

1
paaauleee  24.08.2023, 02:37
@paaauleee

Anstatt das await, würde ich dir nen Timer empfehlen - und dann mit nem timeout Signal arbeiten - await ist ne feine Sache, problem ist aber,, dass der process im Hintergrund weiterläuft - zb wenn du Variablen Werte aufrechnest oder oder oder - hatte da beim Pfadverfolgung via AStarGrid auch schon meine Probleme mit, dass die Figur die "verlorene Zeit" durch das await, durch schnelleres gehen wieder aufholt usw

1
Gamer4214 
Fragesteller
 27.08.2023, 02:22
@paaauleee

 world.gd:13 @ _unhandled_input(): The InputMap action "ESC" doesn't exist.

 <C++-Fehler>  Condition "!E" is true. Returning: false

 <C++-Quelle>  core/input/input_map.cpp:221 @ event_get_action_status()

 <Stacktrace>  world.gd:13 @ _unhandled_input()

Leider. Ich habe den Code in die world.gd gepackt. Leider gibt es bei der World kein Signal namens "unhandled_input". Beim Player hingegen gibt es "input event" als signal.

Womit hast du das verknüpft. Ich denke, das es deshalb nicht funktioniert. Das Spiel startet. Wenn ich ESC drücke kommt die Fehlermeldung.

0
Gamer4214 
Fragesteller
 27.08.2023, 02:29
@Gamer4214

Ergänzung: Ich habe dann nachgeguckt, bei mir heißt das input event für escape "ui_cancel" . dann habe ich "ESC" in "ui_cancel" geändert. Das hat das Problem nicht gelöst. Jetzt passiert gar nichts auch keine Fehler.

0
paaauleee  27.08.2023, 03:01
@Gamer4214

nene - unhandled_input ist kein Signal - das ist ne Funktion:

func _unhandled_input(event):
  if event.is_action_pressed("ESC")
    ## mach irgendwas

Die Funktion kannste Global als Singleton aufrufen - und funktioniert. Das "ESC" war ist ne Tasten oder Controllerbelegung, die man via Settings -> Input Map selber definieren kann - benutze lieber keine Sachen, die mit "ui_" beginnen - sind dem System - zB für Menüs, die du irgendwann selber erstellst, vorbehalten - klappt zwar auch damit, aber nutze eigene InputMaps

0