Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   TweenMax shuffle (реорганизация объектов ) (http://www.flasher.ru/forum/showthread.php?t=160717)

in4core 16.07.2011 16:06

TweenMax shuffle (реорганизация объектов )
 
Ситуация следующая. Есть скажем 20 спрайт контейнеров расположенных друг под другом ( как стандартный список ), очередность установки зависит от значения ( числа ) текстового поля. Каждый контейнер имеет сеттер и геттер этого числа, а так же определенный ID контейнера.
Список получается такой ( изначально ) :

Код:

sprA  | id = 333    |  num = 1
sprB  | id = 3343  |  num = 2
sprC  | id = 13333 |  num = 3
sprD  | id = 3      |  num = 4
sprE    | id = 367  |  num = 5
sprF    | id = 345  |  num = 6
sprN    | id = 332  |  num = N

Это приблизительный пример показывающий как стоят блоки друг за другом в зависимости от числа num ( располагаются соотв по y )

И так задача такая : диспатчится событие об изменении num контейнера ( нужный ищем по ID )
Нужно через твинМакс в данный момент, поменять блоки местами ТАК, чтобы они встали в нужную последовательность в зависимости от возрастания num.
Перед реорганизацией будет например

Код:

sprA  | id = 333    |  num = 1
sprB  | id = 3343  |  num = 222
sprC  | id = 13333 |  num = 3
sprD  | id = 3      |  num = 4
sprE    | id = 367  |  num = 5
sprF    | id = 345  |  num = 6
sprG    | id = 332  |  num = 7

Соотв sprB должен встать в самый конец, а остальные подвинуться в соответствии с правилами ( по возрастанию ). Замечу, что num может не только увеличиваться, но и уменьшаться, правила расстановки при этом остаются теже - разформировать по возрастанию.

Подскажите , как это лучше сделать?

Добавлено через 40 минут
P.s. нахожусь в недосягаемости программы, на вскиду сделал так

Код AS3:

var a:Array = [];
 
                        for (var i:int = 1; i < numChildren; i++) {
                                a.push(getChildAt(i));
                        }
 
                        a.sortOn ( 'num' , Array.NUMERIC ); // num getter контейнера
 
                        for (var j:int = 0; j < a.length; j++) {
 
                                TweenMax.fromTo( a[j] , 1 , { y: a[j].y } , { y: (( a[j].height - 1) * j + 120 ) } );
                        }


cv' 16.07.2011 16:53

Предлагаю добавить их все в массив, и массив сортировать по нужному параметру.

Код AS3:

package 
{
        import com.greensock.easing.Quad;
        import com.greensock.TweenMax;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.utils.Dictionary;
 
        /**
        * ...
        * @author cv
        */

        public class Sprites extends Sprite
        {
                private var sprites:Array;
                private var dic:Dictionary;
 
                public function Sprites()
                {
                        dic = new Dictionary();
                        sprites = [];
                        var container:Sprite = new Sprite();
                        container.x =
                        container.y = 50;
                        addChild(container);
 
                        for (var i:int = 0; i < 10; i++)
                        {
                                var sprite:Sprite = new Sprite();
                                sprite.graphics.beginFill(Math.random() * 0xFFFFFF);
                                sprite.graphics.drawRect(0, 0, 50, 50);
                                sprite.y = 60 * i;
 
                                var info:Object = { };
                                info.sprite = sprite;
                                info.id = i;
                                info.num = i;
 
                                sprite.addEventListener(MouseEvent.CLICK, clickHandler);
                                dic[sprite] = info;
                                sprites[i] = info;
 
                                container.addChild(sprite);
                        }
                }
 
                private function clickHandler(event:MouseEvent):void
                {
                        var info:Object = dic[event.currentTarget];
                        info.num = Math.random() * 10;
                        sprites.sortOn('num', Array.NUMERIC);
                        for (var i:int = 0; i < sprites.length; i++)
                        {
                                info = sprites[i];
                                var sprite:Sprite = info.sprite;
                                TweenMax.to(sprite, 0.5, { ease:Quad.easeOut, y:60 * i});
                        }
                }
        }
 
}


in4core 16.07.2011 17:20

cv' спасибо, в принципе по аналогии я и сделал. Отработало нормально.
Чтобы не открывать новую тему, задам еще вопросик по ТвинМаксу

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

_blockContainer.x + _blockContainer.width <= _msk.width
Далее надо зациклить движение, как только контейнер блоков достигнет 0 отметки маски, пустить его справа-налево снова.

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

cv' 17.07.2011 00:41

Не совсем понятна задача... Если все координаты известны заранее, то можно просто сделать TimelineMax, или yoyo. Если координаты не известны, тогда нет смысла в твине, можно двигать по EnterFrame.


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

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