Godot not correctly adding children nodes

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

I have a node structure as

    Buttons (A Control node)

In the root node, I have a script which is meant to add 50 buttons to the 2nd Control node.Well its not working at all ie it does not display any button at all but when I outputprint(get_node("buttons.get_children())) it gives me this:

[[Button:1142], [Button:1147]]
[[Button:1142], [Button:1147], [Button:1152]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167], [Button:1172]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167], [Button:1172], [Button:1177]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167], [Button:1172], [Button:1177], [Button:1182]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167], [Button:1172], [Button:1177], [Button:1182], [Button:1187]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167], [Button:1172], [Button:1177], [Button:1182], [Button:1187], [Button:1192]]
[[Button:1142], [Button:1147], [Button:1152], [Button:1157], [Button:1162], [Button:1167], [Button:1172], [Button:1177], [Button:1182], [Button:1187], 


Yet it shows no button on the screen.I am sure that globals.CURRENT_LEVEL is et to 50

Here is my code:

extends Control

#onready var level_buttons = buttons.get_children()
var button_init_pos  = Vector2(100,100)
# Called when the node enters the scene tree for the first time.
onready var buttons = get_node("Buttons")
func _ready():
	var i =1
	for i in range(CURRENT_HIGHEST_LEVEL+1):
		if i >0:
			var button = Button.new()
			var button_sprite = Sprite.new()
			button_sprite.texture = load("res://assets/button ("+str(i)+").png")
			if i == 1:
				var prev_button =  buttons.get_child(i -1)
				button.set_position(Vector2(prev_button.get_position().x + 100, button_init_pos.y))

#			print("The level chooser button at : "+str(i)+" has position :"+str(buttons.get_child(i).get_position()))
:bust_in_silhouette: Reply From: Zylann

I don’t have Godot at hand so I’ll have a read and deduce from your post.

First checking the obvious: is your Buttons node visible? Is any of its parents hidden?
Also, are you sure buttons or their parents are not positioned too far away to be seen? I suggest you check the node hierarchy to make sure of that.

Now, your loop code can be simplified.
From this:

var i =1
for i in range(CURRENT_HIGHEST_LEVEL+1):
    if i >0:

To this:

for i in range(1, CURRENT_HIGHEST_LEVEL+1):

In fact, you could even change it to:


And replace your if i == 1 with if i == 0 and str(i) with str(i + 1), but that’s minor.

Now here is a mistaken part:

var prev_button =  buttons.get_child(i -1)

get_child() indexes start from 0. But as we just saw, your loop ignores 0, so prev_button will actually give you the button you just added (i representing the count of buttons and not the index). Then you are moving that button to the right, but it’s not incremental since prev_button == button.
So I assume the result you obtain is all your buttons stacked in the same spot…

You are saying you see no button at all but from what I read, something would show up. I don’t know what could cause none of them to show.