Hi everyone, first time posting here. I was going to go to Discord but thought it’s better to ask somewhere that can turn up on search engines for future confused game devs.

I’ve got a parameterised signal listener like this:

func _on_movement_to_exit_complete(character: Node2D):
	var f = func():
		print("_on_movement_to_exit_complete: "+str(character))
		var dungeon_tilemap: TileMap = dungeon_control.get_current_dungeon_tilemap()
		var party = dungeon_tilemap.get_node("Party")
		var initial_party = dungeon_control.get_parent().get_node("InitialParty")

		party.remove_child(character)
		initial_party.add_child(character)

		if party.get_child_count() == 0:
			for party_member in initial_party.get_children():
				var tilemap_movement: TilemapMovement = party_member.get_node("TilemapMovement")
				print("Disconnecting movement finished listener for "+str(party_member))
				tilemap_movement.disconnect("movement_finished", _on_movement_to_exit_complete(character))

			load_next_level()

	return f

Basically, if all the party members have exited the level (and been removed from the ‘party’ node) I want to disconnect this movement_finished signal from _on_movement_to_exit_complete. But when I try this I get an error:

E 0:00:07:0777   GameControl.gd:80 @ <anonymous lambda>(): Disconnecting nonexistent signal 'movement_finished', callable: <anonymous lambda>(lambda).
  <C++ Error>    Condition "!s->slot_map.has(*p_callable.get_base_comparator())" is true.
  <C++ Source>   core/object/object.cpp:1331 @ _disconnect()
  <Stack Trace>  GameControl.gd:80 @ <anonymous lambda>()
                 TilemapMovement.gd:23 @ _on_animation_finished()

Why doesn’t it think movement_finished exists? Is there something wrong with disconnecting signals from inside their listeners? And is there another way of doing this? (Maybe something like a signal that fires once then disconnects?)

This is in Godot 4 by the way.

Also, is there a way to make the posting box wider in the programming.dev web frontend? It’s really hard to work with pasted code here!

  • AngryClosetMonkey@feddit.ch
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    Where is the definition of your signal? Would be best to compare that with your usage-site.

    Also, in Godot 4 you don’t have to reference signals as strings, they exist as properties on your class. You should be able to reference the signal as i.e. TilemapMovement.movement_finished.connect(...)