Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   [Stage3D] RangeError: Invalid child index in Starling (http://www.flasher.ru/forum/showthread.php?t=204711)

Astraport 09.11.2013 18:03

RangeError: Invalid child index in Starling
 
Вообще-то нет разницы Старлинг это или обычный дисплей лист.

Смысл в том, что на сцене имеется несколько объектов (картинки и текст) для которых важно положение относительно друг друга по глубине (depth). Отправляем их в БД на сервере и, если картинки, то тоже сохраняем на сервере. Везде записываем индекс картинки, он же depth.

Теперь при загрузке с сервера загружаем картинки сихронно лоадером, чтобы было быстрее. Но, т. к. они все разных размеров, то если мелкие лежали над крупными, то оказываются под ними.

Начинаю юзать addChildAt - получаю ошибки с rangeError: Invalid child index

СлаваRa 09.11.2013 18:13

код покажешь?

Astraport 09.11.2013 19:13

Славик, спасибо, твой вопрос подтолкнул меня к поискам.
Повесил слушатель на Event.COMPLETE для каждой картинки и по её срабатыванию: scene.setChildIndex((e.target as Picture), (e.target as Picture).depth);
Вроде работает.

СлаваRa 09.11.2013 19:30

я бы прям фак запилил уже..

Anton Riot 09.11.2013 20:14

Цитата:

Сообщение от Astraport (Сообщение 1151825)
Славик, спасибо, твой вопрос подтолкнул меня к поискам.
Повесил слушатель на Event.COMPLETE для каждой картинки и по её срабатыванию: scene.setChildIndex((e.target as Picture), (e.target as Picture).depth);
Вроде работает.

Если у контейнера имеется N детей, а мы пытаемся одному из его детей дать индекс >= N, то будет ошибка Invalid child index

Я полагаю, надо как-то так

Код AS3:

scene.setChildIndex((e.target as Picture), Math.min(scene.numChildren-1, (e.target as Picture).depth));


Astraport 09.11.2013 21:00

Цитата:

Если у контейнера имеется N детей, а мы пытаемся одному из его детей дать индекс >= N
Маловероятное событие, но все равно спасибо.

bifidokk 11.11.2013 08:48

Цитата:

Сообщение от Astraport (Сообщение 1151835)
Маловероятное событие, но все равно спасибо.

а я как раз тоже на таком моменте и ловил эту ошибку.

KBAC 11.11.2013 12:00

Скорее всего вы пытаетесь расставлять чайлды до того как они все были добавлены в родителя, соответственно вылетаете с индексом, ловите "маловероятное событие".

gloomyBrain 11.11.2013 14:45

Ну и второй вариант - когда мы пытаемся поменять глубину тому, что уже есть в дисплей листе. Получается примерно так (на спичках):
- всего в стопке 10 коробков
- мы хотим переставить самый нижний коробок (ну или из середины, не важно) на самый верх
- вынимаем коробок (с позиции 0) из стопки и ставим на позицию 10 (логично, ведь раньше в стопке было 10 коробков, индексация у нас с 0)

Вроде все верно. Но. Тут кроется ошибка - на момент постановки коробка на самы верх, в стопке всего 9 коробков, а не 10. Ведь мы сначала вынимаем, а потом ставим наверх.

C4Grey 11.11.2013 15:31

А почему бы не отсортировать картинки при запросе по глубине
Код:

SELECT * FROM images ... ORDER BY depth asc
а потом грузить их по очереди, то есть слушатель COMPLETE загрузчика записать так:
Код AS3:

loader.addEventListener(Event.COMPLETE, loadNext);
loadNext();
...
function loadNext(e:Event = null)
{
        if(nextID >= images.length)
        {
                //все загружено
                return;
        }
        if(e != null)//для первого вызова слушателя
                addChild(e.target.data);
        loader.load(images[nextID]);
        nextID++;
}

так, что вверху будет картинка с наибольшим depth?
P.S. Псевдокод :)


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

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