My instantiated scenes aren't executing their _ready() functions

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By SabrinaAsimov

Hello to everyone. I spent only a couple of weeks using Godot.
I´m creating a little puzzle game. The game consists in a board scene (PuzzleManager), a block scene (Block), and a Main scene that for now,only contains the board.

Mi Scene Tree and filesystem

Blocks scenes are instantiated by a function in PuzzleManager and added as his child. But the code in the ready function never executes

I´ll show you first the script attached to PuzzleManager (function create_board() is called in PuzzleManager _ready(). It works fine, create all the pieces correctly

#Blocks are created from a Dictionary, if the function reads "r" creates a block and #makes it red (block has a color property) and so on

var BoardDefault:Dictionary ={
"row0": ["r","e","e","b","p","e"],
"row1": ["e","e","e","e","o","e"],
"row2": ["e","e","e","g","e","e"],
"row3": ["e","e","e","g","e","e"],
"row4": ["e","e","o","p","e","e"],
"row5": ["r","e","e","e","e","b"],

}

var block_path = preload("res://Scenes/Block.tscn")


func create_board():
var dictionary_keys:Array = BoardDefault.keys()
# i = x j= y
for i in BoardDefault.size():
	for j in range (GRID_CELLS_VERT):
		var values_array:Array = BoardDefault.get(dictionary_keys[i])
		var current_read_value:String = values_array[j]
		var id = block_path.instance()
		add_child(id)
		id.position.x =  (CELL_SIZE * j)
		id.position.y = (CELL_SIZE*i)
		# id.sprite.texture funciona porque el block tiene una referencia a su nodo hijo Sprite
		match current_read_value:
			"b":
				var target_texture:Texture = load("res://Assets/Block64x64Blue.png")
				id.color = "blue"
				id.sprite.texture = target_texture
			"e":
				var target_texture:Texture = load("res://Assets/Block64x64GreySolid.png")
				id.color = "empty"
				id.sprite.texture = target_texture
			"g":
				var target_texture:Texture = load("res://Assets/Block64x64Green.png")
				id.color = "green"
				id.sprite.texture = target_texture
			"o":
				var target_texture:Texture = load("res://Assets/Block64x64Orange.png")
				id.color = "orange"
				id.sprite.texture = target_texture
			"p":
				var target_texture:Texture = load("res://Assets/Block64x64Purrple.png")
				id.color = "purple"
				id.sprite.texture = target_texture
			"r":
				var target_texture:Texture = load("res://Assets/Block64x64Red.png")
				id.color = "red"
				id.sprite.texture = target_texture

The problem is that the _ready() function of the blocks doesnt work, input functions does work and variables seem ok in Remote inspector
I´ll paste here the script attached to Block.tscn

extends Area2D
var color:String
onready var sprite:Sprite = $Sprite
func assign_group_by_color():
match color:
	"blue","green","orange","purple","red":
		add_to_group("ColorBlocks",false)
		print("Es de color")
	"empty":
		add_to_group("EmptyTiles",false)
func _ready():
assign_group_by_color()
func _on_Block_input_event(viewport, event, shape_idx):
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.pressed == true:
	print(color + str(position))
	var my_group = get_groups()
	print(my_group)

I can see that the _ready function is not working because blocks are not added to groups: When I try to print the group I only see an empty array

Thank you very much for reading this long newby question !!!

Probably _ready function is being executed, just try to put a print and see if it works. I guess that the problem is in assign_group_by_color, when is it called, the variable color has a value assigned?

abelgutierrez99 | 2021-09-10 13:26

Thank you very much for taking the time to answer my question. I think you gave me a hint, I added a lot of prints to check whats happening. I think the problem is that I first add the blocks as childs, and then I try to assign variables to them, but, correct me if I wrong, _ready() function executes when instances are added as children, right?

SabrinaAsimov | 2021-09-10 17:15

I’m starting using Godot also, so don’t take all my sentences to be true 100%. The use of print is used generally when you are coding to see what is happening. Here you have some documentation. According to my experience, first use _init to get your nodes ready, I mean: assign values, add children… and then you use _ready for example to connect them via signals.

abelgutierrez99 | 2021-09-10 17:33