#Scene Manager and autoloaded Signal Manager

5 messages · Page 1 of 1 (latest)

desert latch
#

Problem
I am trying to change scene between StartMenu and City, which is the game level where the actual game interaction begins. For some reason all signals work except the 'start_button_pressed()'. The print("emit_start_button_pressed") is triggered but the signal does not reach scene_manager.gd.

What I've tried

  • Tried: Connecting to other signals from scene_manager.gd

  • Result: No signals seem to reach scene_manager.gd

  • Tried: Making SceneManager autoloaded and changing scenes from StartMenu

  • Result: Scenes seem to be null when trying to switch to them in scene_manager.

  • Tried: Using 'call_deferred' and 'await get_tree().process_frame'.

  • Result: No changes, signal is still not being connected in scene_manager

Node Structure
Game (Node2D)
|--SceneManager (Responsible for changing scenes)
|--AudioManager
|--GameManager

I have an autoloaded SignalManager that handles all signal communication.

#

start_menu.gd

extends Node2D

func _on_start_button_pressed():
    await get_tree().process_frame
    SignalManager.emit_start_button_pressed()

#

signal_manager.gd

extends Node2D

signal game_ready()
signal level_loaded()
signal money_added(crate: Crate)
signal money_removed(crate: Crate)
signal total_money_changed(value: int)
signal crate_destroyed(crate: Crate)
signal start_button_pressed()

func _ready():
    print("SignalManager READY")

# Emitters
func emit_game_ready():
    print("SignalManager: emit_game_ready")
    call_deferred("_deferred_game_ready")

func emit_level_loaded():
    print("SignalManager: emit_level_loaded ")
    call_deferred("_deferred_level_loaded")

func emit_money_added(crate: Crate):
    print("SignalManager: emit_money_added", crate)
    call_deferred("_deferred_money_added", crate)

func emit_money_removed(crate: Crate):
    print("SignalManager: emit_money_removed", crate)
    call_deferred("_deferred_money_removed", crate)

func emit_total_money_changed(value: int):
    print("SignalManager: emit_total_money_changed: ", value)
    call_deferred("_deferred_total_money_changed", value)

func emit_crate_destroyed(crate: Crate):
    print("SignalManager: emit_crate_destroyed", crate)
    call_deferred("_deferred_crate_destroyed", crate)

func emit_start_button_pressed():
    print("SignalManager: emit_start_button_pressed")
    call_deferred("_deferred_start_button_pressed")

# Deferred
func _deferred_game_ready():
    emit_signal("game_ready")

func _deferred_level_loaded():
    emit_signal("level_loaded")

func _deferred_money_added(crate: Crate):
    emit_signal("money_added", crate)

func _deferred_money_removed(crate: Crate):
    emit_signal("money_removed", crate)

func _deferred_total_money_changed(value: int):
    emit_signal("total_money_changed", value)

func _deferred_crate_destroyed(crate: Crate):
    emit_signal("crate_destroyed", crate)

func _deferred_start_button_pressed():
    emit_signal("start_button_pressed")

#

scene_manager.md

extends Node2D

var start_menu_scene = preload("res://scenes/Menus/StartMenu.tscn")
var city_level_scene = preload("res://scenes/Levels/City.tscn")
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
    print("SceneManager READY")
    SignalManager.connect("start_button_pressed", Callable(self, "_switch_to_city_level"))
    _switch_to_start_menu()

func _switch_to_start_menu():
    print("START MENU LOADED")
    get_tree().change_scene_to_packed(start_menu_scene)

func _switch_to_city_level():
    queue_free()
    print("CITY LEVEL LOADED")
    get_tree().change_scene_to_packed(city_level_scene)
languid mural
#

Not sure if it matters, but they updated the syntax in 4.0.
This works for me

Global.signal.connect(function)
Global.signal.emit()```