Jump to content

Некорреткно работает setOrder для виджетов в с++ API?


photo

Recommended Posts

Здравствуйте.

 

Столкнулся со следующей проблемой: при отрисовке виджетов система странно обрабатывает setOrder. По идее чем меньше значение - тем ниже должен отрисовываться виджет, однако отрисовка все равно идет в том порядке, в котором я создавал виджеты (позже объявленный - на переднем плане). В чем может быть проблема? Куски кода, ответственные за создание объектов и setOrder, и скриншоты прилагаю.

 

Init():

...
mark = new Poi(gui, "Ближняя кнопка");
objectName = new Poi(gui, "Дальняя кнопка");
...

Poi->Update():

int order = int(-128 * (distance / renderDistance)); // distance - расстояние между текущей позицией игрока и объектом в сцене, renderDistance - дальность прорисовки
markerTable->setOrder(order); // markerTable - GridBox c 4 ячейками, где в первой расположена кнопка, а в трех других - лейблы.

post-2335-0-79917200-1475218410_thumb.png

post-2335-0-69123500-1475218422_thumb.png

Link to comment

Здравствуйте.

setOrder влияет на порядок отрисовки Widget'ов внутри одного VBox/HBox/GridBox контейнера. Если Widget'ы находятся в разных контейнерах, то setOrder никак не повлияет на порядок их отрисовки. Не могли бы вы отправить небольшой семпл, где воспроизводится ваша проблема?

Спасибо.

Link to comment

Правильно ли я в таком случае понимаю, что на контейнеры setOrder не должен работать? Просто заметил, что если сделать markerTable->setOrder(1), то кнопка и лейбл начинают отрисовываться даже поверх встроенного GUI (на скрине пример подобного поведения). Семпл в архиве не влезает через загрузку форума (архив получился около 125 МБ), через что можно Вам его отправить? Проект для отладки запускаю через VS2015.

post-2335-0-12680400-1475232393_thumb.png

Link to comment

Сцену можно залить на наш фтп (данные для доступа в моей подписи), а также на любой удобный для вас файл-хостинг. Файлы из директории bin вкючать необязательно, достаточно указать на какой версии Unigine SDK нужно запустить сэмпл.

 

Спасибо!

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment

Отправил сцену через ваш FTP.

Заметил еще интересное поведение функции:

 

Если вместо 

int order = int(-128 * (distance / renderDistance));

задать, например, 

int order = int(127-240 * (distance / renderDistance));

то пока order>0 у обоих виджетов, они оба рисуются поверх встроенного GUI, как только у хотя бы одного виджета order становится меньше нуля - оба виджета уходят на задний план по отношению к встроенному GUI.

Link to comment

teplov-it,

Спасибо за тестовую сцену.

Вызов setOrder не влияет на позицию в иерархии пока не будет вызвана функция raise или addChild.
Чтобы всё заработало как следует нужно добавить вызов функции raise после setOrder:

markerTable->setOrder(order);
markerTable->raise(markerTable->getWidget());

В документацию добавим пример использования.

Приносим вам свои извинения за доставленные неудобства.

Link to comment
×
×
  • Create New...