Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [...] as3isolib слои объектов (http://www.flasher.ru/forum/showthread.php?t=211697)

Godwarlock 18.10.2015 06:44

as3isolib слои объектов
 
Всем привет. В общем что-то пока не могу разобраться, задача обстоит в порядке объектов расположенных на сцене. Надо чтобы при нажатии на кнопку, повышался уровень индекса объекта на сцене и он переграждал остальные объекты, если стоит выше.

Код AS3:

 private function upLayer(e:MouseEvent):void 
                {
 
 id_obj = scene.getChildIndex(targetObject);
 scene.setChildIndex(targetObject, id_obj++);
//scene:IsoScene, targetObject:IsoDisplayObject - ссылка на объект уровень которого надо повысить среди остальных объектов сцены scene и id_obj текущий индекс targetObject, который мы прибавляем чтобы переставить объект на уровень выше
scene.render();
 
                    }

Но индекс не меняется и объект находится на том же месте, котором и стоял. Подскажите что не так?

ZackMercury 18.10.2015 11:41

Фишка в операторе инкремента.
i++ возвращает i, а только потом добавляет к нему единицу.
++i возвращает i уже повышенную на единицу.

Код AS3:

 private function upLayer(e:MouseEvent):void 
                {
 
 id_obj = scene.getChildIndex(targetObject);
 scene.setChildIndex(targetObject, ++id_obj);
//scene:IsoScene, targetObject:IsoDisplayObject - ссылка на объект уровень которого надо повысить среди остальных объектов сцены scene и id_obj текущий индекс targetObject, который мы прибавляем чтобы переставить объект на уровень выше
scene.render();
 
                    }


Godwarlock 18.10.2015 17:16

Что-то не помогло, объекты остаются на тех же слоях и ничего не изменяется, хотя по сути после рендера, объект с индексом ++id_obj должен был перенестись на индекс того объекта, который мы поднимаем вверх, а тот что вверху соответственно заменяет индекс того, который должен опуститься или я чет не так понял)

ZackMercury 19.10.2015 03:18

Трейсните и проверьте, изменяется ли индекс вообще.

Godwarlock 19.10.2015 03:24

Изменяется, но к объекту не применяется

Добавлено через 42 часа 30 минут
Всё разобрался, надо поднимать/опускать по z, правда весьма муторно с точностью

Godwarlock 24.10.2015 20:57

Не фига не разобрался, не устраивает вариант по z. Надо менять местами детей непосредственно в самой сцене, т.к когда объекты в сцену располагаются их глубина друг от друга явно зависит от индекса в котором они находятся, да и метод setChildIndex предназначен именно для этого. Но метод не работает.
Код AS3:

 scene.setChildIndex(targetObject, 0);

По идее объект должен поменяться местами с тем объектом, у которого index равен 0. Но ничего не меняется.

ShockWave512 25.10.2015 10:43

влияет не только Z но и Х У плюс ширина-высота-длинна объекта
подвинуть надо ближе к камере, и вызвать метод render() у сцены

Godwarlock 25.11.2015 04:15

Вернусь к вопросу, уже много чего перепробовал, но не могу придти к итогу.
Есть сцена, на сцену по очередности добавляются объекты, к примеру по такому принципу
Загружается платформа
Загружаются стены
Загружаются персонажи
Собственно у персонажа координата по z выставлена 30, в то время как у остальных объект по 0.
cellSize при этом равен 60;
В чем суть. По скольку персонажи, грузятся в последнюю очередь, они всегда будут визуально поверх всех предыдущих объектов в том числе стенок, по скольку по координате z выше на половину размера ячейки. Теперь попробуем такой вариант
Загружается платформа
Загружаются персонажи
Загружаются стены
Что получается. Персонажи выше платформы, но когда они стоят у стены, то на первой половине они визуально выше, а с другой стороны, где по идее стена должна скрывать персонажа, они становятся ниже и их видно как будто они за стеной, а не под ней. Я не могу понять почему так происходит, мне говорили что регулировать высоту над другими объектами надо по координате Z, я это сделал, но очередность создания объектов игнорирует это. И стандартными методами библиотеке, казалось бы setChildIndex ничего не решает. Я не понимаю как выставить объект по индексу, ибо в стандартной библиотеке есть такая возможность, как раз setChildIndex которая меняет визуальное отображение объекта, над предыдущим. Подскажите как мне решить эту проблему) Очень важно)

ShockWave512 25.11.2015 04:35

- ни очередность, ни индекс не влияют на сортировку перекрытия объектов в сцене

постоянно сталкивался с такой проблемой, и вечно что то торчало поверх другого не в нужном порядке

- решается представлением всех объектов в виде боксов(прямоугольных ящиков), (а изолиб так и видит все объекты, на флешовые/старлинговые спрайты и индексы ему плевать)

тогда действуют простые правила:

- при ясно заданных координатах (X:Y:Z) и размере "ящика" (width:length:height) (ширина:длина:высота:)

- если из одинаковых кубов один ближе к "камере", то виден он

- если один из одинаковых кубов выше по Z, то виден он

- если один куб больше, а оба на одинаковых координатах, то виден будет больший куб

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

Godwarlock 25.11.2015 06:16

Спасибо ShockWave512, идея с представление объектов в виде боксов с фиксированным размером, вроде как избавляет от проблемы. Еще раз спасибо большое! Все работает как надо)) Сам бы хрен догадался)


Часовой пояс GMT +4, время: 17:18.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.