Форум 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;
}



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

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