Godot Version
4.3
Question
Hello there!
I am pretty new to GDScript, but I’m not THAT bad. Even tho, I have a problem I can’t resolve.
As in title - I want to do such notebook. It’s important to be done with something that can change midgame (because we will learn about characters). I’m trying to do basic one first.
First - here’s my notebook node + script (in Postacie)
extends Control
#Dane postaci
var characters = [
{"name": "Test 1", "data": "Data 1", "splash": "res://assets/characters_sprites/test.png", "info": "InfoText 1"},
{"name": "Test 2", "data": "Data 2", "splash": "res://assets/characters_sprites/test.png", "info": "InfoText 2"},
{"name": "Test 3", "data": "Data 3", "splash": "res://assets/characters_sprites/test.png", "info": "InfoText 3"},
]
# Załaduj CharacterUI
var CharacterUI = preload("res://scenes/gui/Notebook/CharacterNotebookUI.tscn")
# Liczba postaci naraz na stronie
var characters_per_page = 2
var current_page = 0
# HBoxContainers
@onready var character_box1 = $CharacterBox1
@onready var character_box2 = $CharacterBox2
@onready var page_count_label = $"../../PageCountCharacter"
func _ready():
update_page()
# Aktualizacja stron
func update_page():
# Wyczyść obecne
clear_children(character_box1)
clear_children(character_box2)
# Które postacie pokazać
var start_index = current_page * characters_per_page
var end_index = min(start_index + characters_per_page, characters.size())
# Loop
for i in range(start_index, end_index):
var character_data = characters[i]
print("Instantiating CharacterUI with data: %s" % character_data)
var character_ui = CharacterUI.instantiate()
character_ui.set_data(character_data)
if i == start_index:
character_box1.add_child(character_ui)
else:
character_box2.add_child(character_ui)
if page_count_label:
var total_pages = ceil(float(characters.size()) / characters_per_page)
page_count_label.text = "Strona %d z %d" % [current_page + 1, total_pages]
else:
print("PageCountLabel not found")
func _on_left_pressed():
if current_page > 0:
current_page -= 1
update_page()
func _on_right_pressed():
if current_page < ceil(float(characters.size()) / characters_per_page) - 1:
current_page += 1
update_page()
func clear_children(container: Container):
for child in container.get_children():
child.queue_free()
As you can see, I try do it that way it imports “pages” from different scene - which is CharacterNotebookUI. Here’s script (Node is very simmilar to the one on picture - Control + from character box1)
extends Control
var splash_rect : TextureRect
var name_label : Label
var data_label : Label
var info_label : Label
func _ready():
var profile1 = get_node("CharacterBox1/Character1/Profile1") as Control
var bio1 = get_node("CharacterBox1/Character1/Profile1/Bio1") as VBoxContainer
var info1 = get_node("CharacterBox1/Character1/Info1") as VBoxContainer
splash_rect = get_node("CharacterBox1/Character1/Profile1/TextureRect") as TextureRect
name_label = get_node("CharacterBox1/Character1/Profile1/Bio1/Name1") as Label
data_label = get_node("CharacterBox1/Character1/Profile1/Bio1/Data1") as Label
info_label = get_node("CharacterBox1/Character1/Info1/InfoText1") as Label
print("splash_rect: %s" % splash_rect)
print("name_label: %s" % name_label)
print("data_label: %s" % data_label)
print("info_label: %s" % info_label)
func set_data(character_data: Dictionary):
if splash_rect:
splash_rect.texture = load(character_data.get("splash", "res://icon.svg"))
if name_label:
name_label.text = character_data.get("name", "")
if data_label:
data_label.text = character_data.get("data", "")
if info_label:
info_label.text = character_data.get("info", "")
What is my problem - game detects that after entering notebook there should be 3 characters shown, so there’s 2 pages. Yet those pages are empty.
I’m really struggling at this point and when I do something, some errors pops up. Is it even possible to make it that way?
Also, I wanted to use Dialogic variables at one point - let’s say that we have variable called character-name, which changes as we get to know them, so it kind of “unlocks” in our notebook.
Please, give me at least an idea what can I do, or if there’s a better way.