From 8a58aa7efc8cc27124f583789fb8f493b2ee3366 Mon Sep 17 00:00:00 2001 From: Julian Murgia Date: Sat, 30 Apr 2022 20:10:14 +0200 Subject: [PATCH] Fix: disable ESCGame inputs until signal room_ready is emitted (#582) * Fix: disable ESCGame inputs until signal room_ready is emitted * fix: add a new function to use in _input() to check for inputs * Apply suggestions from code review Co-authored-by: balloonpopper <5151242+balloonpopper@users.noreply.github.com> Co-authored-by: Duncan Brown --- .../escoria-core/game/core-scripts/esc_game.gd | 16 ++++++++++++++++ addons/escoria-core/game/escoria.gd | 11 +++++++++++ addons/escoria-core/game/main.gd | 2 +- addons/escoria-ui-simplemouse/game.gd | 8 ++++---- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/addons/escoria-core/game/core-scripts/esc_game.gd b/addons/escoria-core/game/core-scripts/esc_game.gd index 4cd88fcb..95401a65 100644 --- a/addons/escoria-core/game/core-scripts/esc_game.gd +++ b/addons/escoria-core/game/core-scripts/esc_game.gd @@ -38,6 +38,11 @@ export(NodePath) var ui_parent_control_node # A reference to the node handling tooltips var tooltip_node: Object +# Boolean indicating whether the game scene is ready to accept inputs +# from the player. This enables using escoria.is_ready_for_inputs() in _input() +# function of game.gd script. +var room_ready_for_inputs: bool = false + # Function called when ESCGame enters the scene tree. func _enter_tree(): @@ -51,6 +56,12 @@ func _enter_tree(): self, "_on_action_finished" ) + + escoria.main.connect( + "room_ready", + self, + "_on_room_ready" + ) # Function called when ESCGame exits the scene tree. @@ -447,3 +458,8 @@ func escoria_show_ui(): "esc_game.gd#escoria_show_ui", ["UI parent Control node not defined!"] ) + + +# Manage signal room_deady from main.gd. +func _on_room_ready(): + room_ready_for_inputs = true diff --git a/addons/escoria-core/game/escoria.gd b/addons/escoria-core/game/escoria.gd index 642ec1f9..bfa3b6e3 100644 --- a/addons/escoria-core/game/escoria.gd +++ b/addons/escoria-core/game/escoria.gd @@ -389,3 +389,14 @@ func _handle_direct_scene_run() -> void: if current_scene_root is ESCRoom: escoria.object_manager.set_current_room(current_scene_root) + +# Used by game.gd to determine whether the game scene is ready to take inputs +# from the _input() function. To do so, the current_scene must be set, the game +# scene must be set, and the game scene must've been notified that the room +# is ready. +# +# *Returns* +# true if game scene is ready for inputs +func is_ready_for_inputs() -> bool: + return escoria.main.current_scene and escoria.main.current_scene.game \ + and escoria.main.current_scene.game.room_ready_for_inputs diff --git a/addons/escoria-core/game/main.gd b/addons/escoria-core/game/main.gd index 220d1979..53495cee 100644 --- a/addons/escoria-core/game/main.gd +++ b/addons/escoria-core/game/main.gd @@ -90,8 +90,8 @@ func set_scene_finish() -> void: current_scene.visible = true clear_previous_scene() - emit_signal("room_ready") + # Cleanup the previous scene if there was one. diff --git a/addons/escoria-ui-simplemouse/game.gd b/addons/escoria-ui-simplemouse/game.gd index 5a7b9b34..17c39b06 100644 --- a/addons/escoria-ui-simplemouse/game.gd +++ b/addons/escoria-ui-simplemouse/game.gd @@ -97,10 +97,10 @@ func _exit_tree(): func _input(event: InputEvent) -> void: - if escoria.main.current_scene and escoria.main.current_scene.game: - if event is InputEventMouseMotion: - escoria.main.current_scene.game. \ - update_tooltip_following_mouse_position(event.position) + if escoria.is_ready_for_inputs(): + if event is InputEventMouseMotion: + escoria.main.current_scene.game. \ + update_tooltip_following_mouse_position(event.position) # https://github.com/godotengine/godot-demo-projects/blob/3.4-585455e/misc/joypads/joypads.gd