Один раз сработало, но не в том месте. Я изменил некоторые флаги размера контейнера, и вот прошло 3 часа с тех пор, как все пошло не так(
Проблема:
У меня есть NinePatchRect
(1) внутри другого NinePatchRect
(2) внутри GridContainer
. Мне нужно передать размер внешнего (2) прямоугольника внутреннему (1). Оба NinePatchRect
имеют текстуры, установленные во время выполнения. Поскольку я работаю внутри контейнера, единственный способ получить начальный размер — это установить привязку для (2), в противном случае размер будет равен (0, 0)
. И я действительно вижу изменение значения size.x
в редакторе после назначения привязок. НО, как только код будет выполнен, к тому времени, как я доберусь до значения size.x
, оно станет 0
. Хотя текстура размещена и показана правильно.
NPR (2) имеет следующие флаги размеров:Horizontal
Заполнить РазвернутьVertical
Заполнить
NPR (1) установлен на layout_mode
POSITION
в положении NPR (2). Если я использую какие-либо привязки, я не смогу изменить размер прямоугольника (что мне нужно делать динамически).
На самом деле у меня есть RichTextLabel
(того же размера, который я мог бы использовать) рядом с тем же GridContainer
, и я также не могу получить значение его размера, поскольку оно превращается в (0, 0)
.
Вопрос:
Как мне узнать размер ребенка GridContainer
?
Редактировать:
Я нашел этот пост на форумах Godot, который, кажется, то, что мне нужно, но трюк с простой рамкой не работает, так как я все еще получаю размер (0, 0)
Для NPR (1) установлено значение Layout_mode POSITION в позиции NPR (2). Если я использую какие-либо привязки, я не смогу изменить размер прямоугольника (что мне нужно делать динамически).
Ты должен быть способен. Установка привязки приведет к автоматическому изменению размера Control
, но его размер будет устанавливаться не в каждом кадре, а только при изменении размера контейнера. И да, свойства позиции скрыты в инспекторе, но вы все равно сможете записать их из кода.
В любом случае, если вы предпочитаете, чтобы Container
вообще не устанавливал размер, вы можете использовать Control
(старый добрый Control
) внутри Container
. Таким образом, Container
задает его размер Control
, а внутри него Control
вы можете добавить все, что захотите, с помощью привязок или установки кода формы размера.
И, наконец, вы можете подключить resize
сигнал об этом Control
, чтобы дети могли отреагировать, когда контейнер его изменил.
Как получить размер дочернего элемента GridContainer?
Control
внутри Container
будет знать свой размер, как если бы его не было в Container
. Я понимаю, что вы можете не знать этот размер до того, как его установит Container
. Для этого вам может потребоваться прослушать (или дождаться) сигнал resized
.
Я нашел этот пост на форумах Godot, который, кажется, мне нужен, но трюк с холостым кадром не работает, так как я все еще получаю размер (0, 0)
На связанной странице есть такая строка:
yield(get_tree(),"idle_frame") # yield until the next idle frame
Это код Годо 3. В Godot 4 вы бы сделали что-то вроде этого:
await get_tree().process_frame
В данном случае мы ожидаем сигнала process_frame
дерева сцены.
@DotFX Насколько я знаю, после await
выполнение возобновится в основном потоке. Итак, если вы использовали вторичный поток, это может быть изменением потока.
Плохо объяснил, плохо( но главное - AWAITING PROCESS FRAME работает! Если нет, поместите его в другое место (только для себя на будущее). Теперь к тому, что я плохо объяснил: у меня есть 2 функции , 1 установка (была с ожиданием), 2 обновления (с отпечатками). Одно за другим. Пока я ждал кадра процесса в настройке, отпечатки из 2-й функции появились до завершения настройки. Поэтому я перенес ожидание позже, и теперь оно работает отлично) Еще раз спасибо: D
Использование отдельного элемента управления Empty для получения размера вроде как работает, но второе предложение (фрейм процесса ожидания) работает более чисто, «вроде как». Я отлаживал его с помощью некоторых операторов
print
и заметил, что моиprint
появились до того, как инструмент отладки редактора добрался до точки останова, которую я разместил послеawait
. Итак, мой дополнительный вопрос: разделяет ли ожидание сигнала кадра процесса выполнение функции в отдельный поток? Потому что сейчас он делает именно то, что мне нужно, просто делает это позже.