Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   setChildIndex() - как правильно (http://www.flasher.ru/forum/showthread.php?t=112361)

Ar4ibald 25.05.2008 17:12

setChildIndex() - как правильно
 
Всем привет.
Столкнулся с такой проблемой при переходе на AS3:

Код:

movie.swapDepths(Math.round(this._xscale) + 100); // = 160
мувиклип становиться на слой 160, хотя он только один

Код:

this.setChildIndex(movie, Math.round(thumb.scaleX*100)+100);// = 160
в этом случае выдает ошибку, потому что мувиклип один и в аргументе функции можно написать только 1

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

fljot 25.05.2008 17:29

в AS3 нету слоёв и глубин.
DisplayObjectContainer может иметь детей, каждый из которых будет иметь индекс. индексы от 0 и больше. детей с одинаковым индексом быть не может.
прочитайте про концепцию Display List

DarkLight 25.05.2008 17:41

Ну индекс это и есть глубина) В AS3 пустых индексов посреди листа делать нельзя, поэтому аналог swapDepths - swapChildren принимает 2 DisplayObject-а как аргументы. Для того чтобы вынести какой-либо элемент выше других, можно получить максимальный индекс засчет использования свойства numChildren, а затем переставить клипы в нужном порядке.

А насчет привязки - нет смысла так делать, лучше брать значения размера, упорядочивать их в массиве по возрастанию/убыванию и расставлять детей в соответствии с индексами

Ar4ibald 25.05.2008 17:42

понятно, просто проблема теперь чисто логическая:
есть количество мувиков, в ходе программы их размер изменяеться посредством scaleY и scaleX, теперь чем больше размер, тем выше индекс. Уже весь извелся, не могу придумать как привязать scale и номер индекса.

BlooDHounD 25.05.2008 17:57

привяжите массив и сортируйте в нём ваших детей. номер индекса в массиве будет соответвовать его номеру в дисплэйлисте.

Ar4ibald 25.05.2008 18:13

спасибо всем за советы - буду реализовывать :)

Ar4ibald 25.05.2008 22:33

чтоб не создавать новый пост решил спросить здесь:
Код:

picholder.useHandCursor = true; // picholder - мувиклип
почему-то не срабатывает, может я забыл какой то класс подключить?

BlooDHounD 26.05.2008 00:04

buttonMode

Ar4ibald 26.05.2008 01:10

BlooDHounD, пасиба :)

Сайлас 26.05.2008 19:18

Если интересно, могу подсказать с реализацией достаточно быстро работающего zOrder, если наследовать класс от MovieClip, можно модифицировать под независимый класс:

Код:

private var zOrder:Array = new Array;

public function addChildZOrder(child:DisplayObject,zo:int):DisplayObject
{
        if (contains(child))
                return child;
        var i:int = arrayBSearch(zOrder,zo);
        arrayInsert(zOrder,i,zo);
        super.addChildAt(child,i);
}

override public function removeChild(child:DisplayObject):DisplayObject
{
        if (this.contains(child)) {
                var i:int = getChildIndex(child);
                return this.removeChildAt(i);
        }
        else {
                return null;
        }
}

override public function removeChildAt(index:int):DisplayObject
{
        arrayDelete(zOrder,index);
        return super.removeChildAt(index);
}

public static function arrayInsert(arr:Array,i:int,elem:*):void
{
        for(var j:int=arr.length; j > i; --j)
                arr[j] = arr[j-1];
          arr[i] = elem;
}

public static function arrayDelete(arr:Array, i:int):void
{
          if(i >= 0){
        for(; i+1 < arr.length; i++){
                  arr[i] = arr[i+1];
        }
        if(i < arr.length)
                  arr.length = arr.length - 1;
          }
}

public static function arrayBSearch(arr:Array, val:int, property:String=null, bound:Boolean=true):int
{
        var ret:int;
          var l:int = 0, u:int = arr.length - 1, i:int;
          ret = -1;
          while(l <= u){
            i = (l + u) >> 1;
            var s:int = (property == null ? arr[i] : arr[i][property]);
            if    (s > val) u=i-1;
            else if(s < val) l=i+1;
                else{ ret = i; break; }
          }
          if(ret < 0 && bound)
                ret = l;
          return ret;
}


Ar4ibald 27.05.2008 12:28

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

Код:

rec_array.sortOn(["xik", "name1"], Array.DESCENDING|Array.NUMERIC );
                                for(i=0; i<rec_array.length; i++){
                                thumb=rec_array[i].name1;
                               
                                trace("Before:  "+rec_array[i].dep);
                                allpicholder.setChildIndex(thumb, rec_array[i].dep-1);
                                            //allpicholder содержит все мувики, которые нужно посортировать
                                trace("After: "+allpicholder.getChildIndex(thumb));

                // индекс мувиков до и после setChildIndex одинаковый               
                                }

Вроде же правильно написал, ошибок не выдает и не работает.

silin 27.05.2008 15:33

для контейнера, содержащего ТОЛЬКО объекты, подлежащие сортировке, можно просто удалить всех, а потом поставить в новом порядке:
Код:

private function sortChilds():void
{
       
        var indxArr:Array = [];
        var len:int = numChildren;

        while (numChildren > 0)
        {
                var child:DisplayObject = getChildAt(0);
                indxArr.push({ child:child, z: zOrder(child)});//zOrder - метод, возвращающий критерий глубины (scaleY, например)
                removeChild(child);
        }
       
        indxArr.sortOn("z", Array.NUMERIC | Array.DESCENDING );
        for (var i:int = 0; i < len; i++)
        {
                addChild(indxArr[i].f);
        }
       
}


Сайлас 27.05.2008 17:01

Удалять плохо - будет веселое перемигивание

allpicholder отнаследуйте от MovieClip или Sprite и добавьте мои методы, раз это контейнер всех необходимых объектов. Не надо будет привязываться ни к имени, ни к scaleX, сами будете задавать зОрдер, хоть рандомом, хоть как.

silin 27.05.2008 17:12

>>будет веселое перемигивание
не будет: изображение выводится один раз, после выполнения кода

ps пример где это реально работает (правда под 10й плеер)

Сайлас 27.05.2008 17:14

А если придется еще раз удалить и добавить или в зОрдере что-то поменять?

silin 27.05.2008 17:16

а если придется, то будем удалять и менять :)
сори, не понял вопроса

Сайлас 27.05.2008 18:01

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

silin 27.05.2008 18:12

не понял опять, показать можешь?
впрочем не важно: если постараться, то можно и браузер уронить..

Сайлас 27.05.2008 18:15

Ну смотри, если по циклу сделать removeChild, а потом делать addChild, то будет небольшое мигание... По крайней мере у меня так происходит

silin 27.05.2008 19:28

а если по циклу сделать x++, то ты увидишь как объект плавно перемещается ?
не хочу спорить, но нет у меня мигания, да и не должно его быть, имхо

Сайлас 27.05.2008 19:48

вот х++ не увидишь конечно. А при ремув+эдд оно есть... Быстро конечно все делается и т.п., но заметно.
И если делать у Sprite
.graphics.clear();
.graphics.bitmapFill(bmd);
.graphics.drawRect(..);
.graphics.endFill();
Увидишь как все перемигивается

Ar4ibald 28.05.2008 22:23

у меня процедура обновления происходит около 30 раз в секунду (создаю карусель с картинок). Вот все готово, только не могу с этими слоями чертовыми разобраться.
Сайлас, можете на примере самом простом показать как к мувику allpicholder применить это все, потому чито с ООП знаком меньше месяца и в AS3 изучил пока не все? Буду очень благодарен

Сайлас 29.05.2008 15:02

Ну я же уже выложил. Вот собранный пример. Поддержку динамического изменения zOrder уж сами-то напишете? :)
Код:

public class TestZOrder extends MovieClip
        {
                private var zOrder:Array = new Array;
               
                public function TestZOrder()
                {
                        super();
                }
               
                override public function addChild(child:DisplayObject):DisplayObject
                {
                        throw new Error("Use addChildZOrder!");
                        return null;
                }
               
                override public function addChildAt(child:DisplayObject,index:int):DisplayObject
                {
                        throw new Error("Use addChildZOrder!");
                        return null;
                }
               
                override public function removeChild(child:DisplayObject):DisplayObject
                {
                        if (this.contains(child)) {
                                var i:int = getChildIndex(child);
                                return this.removeChildAt(i);
                        }
                        else {
                                return null;
                        }
                }
               
                override public function removeChildAt(index:int):DisplayObject
                {
                        arrayDelete(zOrder,index);
                        return super.removeChildAt(index);
                }
               
                public function addChildZOrder(child:DisplayObject,zo:int):void
                {
                        if (contains(child))
                                return;
                        var i:int = arrayBSearch(zOrder,zo);
                        arrayInsert(zOrder,i,zo);
                        super.addChildAt(child,i);
                }
               
                public static function arrayInsert(arr:Array,i:int,elem:*):void
                {
                        for(var j:int=arr.length; j > i; --j)
                            arr[j] = arr[j-1];
                          arr[i] = elem;
                }
               
                public static function arrayDelete(arr:Array, i:int):void
                {
                          if(i >= 0){
                    for(; i+1 < arr.length; i++){
                              arr[i] = arr[i+1];
                    }
                    if(i < arr.length)
                              arr.length = arr.length - 1;
                          }
                }
               
                public static function arrayBSearch(arr:Array, val:int, property:String=null, bound:Boolean=true):int
                {
                        var ret:int;
                          var l:int = 0, u:int = arr.length - 1, i:int;
                          ret = -1;
                          while(l <= u){
                            i = (l + u) >> 1;
                            var s:int = (property == null ? arr[i] : arr[i][property]);
                            if    (s > val) u=i-1;
                            else if(s < val) l=i+1;
                            else{ ret = i; break; }
                          }
                          if(ret < 0 && bound)
                            ret = l;
                          return ret;
                }
        }


Ar4ibald 29.05.2008 23:29

я прошу изинение за свой примитивизм, но я не имею представление как это подключить.

Сайлас 29.05.2008 23:34

Подключить в Flash'e или в .as файле, во Flex'e том же? :)

Ar4ibald 29.05.2008 23:36

подключит во Флеше as файл я сумею :), но как применять методы класса к моему
мувику - allpicholder?

Сайлас 29.05.2008 23:44

Если честно, то не знаю, т.к. не разбирался. Сам пишу во флексе, анимирует отдельный человек, если нужно сложная анимация, я умею только во фреймах AS писать, документ класс создать, заэкспортить для АС мувик и т.п. :)
Так что тут я не совсем помощник :)

Ar4ibald 30.05.2008 00:07

блин, ну что поделаешь.
Буду пробовать модель silina, хотя смотря на ваш класс, мне кажеться что идея схожая с идеей silina (возможно я и ошибаюсь)


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

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