diff --git a/examples/shared/scripts/lan-bootstrapper.gd b/examples/shared/scripts/lan-bootstrapper.gd index 838446d..6976eb0 100644 --- a/examples/shared/scripts/lan-bootstrapper.gd +++ b/examples/shared/scripts/lan-bootstrapper.gd @@ -72,24 +72,34 @@ func join(): print("Client started") connect_ui.hide() - # Ensure game window has keyboard focus for input - get_window().grab_focus() + # Force window focus for keyboard input (Windows GUI apps need this) + _ensure_input_focus() # Only start manually if NetworkEvents is not handling it (e.g. multiplayer-simple) if not NetworkEvents.enabled: NetworkTime.start() +func _ensure_input_focus() -> void: + ## Force the game window to have keyboard focus and captured mouse. + ## On Windows GUI exports, the window may not hold keyboard focus after + ## the connection UI is dismissed, causing Input.get_axis() to return 0. + OS.move_to_foreground() + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + # Deferred retry after window settles + get_window().call_deferred("grab_focus") + Input.call_deferred("set_mouse_mode", Input.MOUSE_MODE_CAPTURED) + func _enter_tree(): # Hide and show UI as appropriate # These handlers are necessary, since the game could have started via # autoconnect, or any other method NetworkEvents.on_client_start.connect(func(__): connect_ui.hide() - get_window().grab_focus() + _ensure_input_focus() ) NetworkEvents.on_server_start.connect(func(): connect_ui.hide() - get_window().grab_focus() + _ensure_input_focus() ) NetworkEvents.on_client_stop.connect(func(): connect_ui.show()) NetworkEvents.on_server_stop.connect(func(): connect_ui.show())