Почему этот эффект перемещения не работает на моих спрайтах, когда эффект затухания работает? - PullRequest
0 голосов
/ 08 февраля 2011

Может кто-нибудь объяснить, почему это не хочет работать?Идти за логотипом немного уместно.

Когда закомментирована переменная dMove, я получаю соответствующую линию квадратов, появляющихся и исчезающих в случайных точках вдоль оси x = 78, но при введении ничего не появляетсявообще ...

private var floatBG:UIComponent = new UIComponent();

private function addDP(event:TimerEvent):void{  

            var dY:Number = 5+Math.ceil(Math.random()*60);
            var dSize:Number = Math.ceil(Math.random()*12);
            var dAlpha:Number = Math.random()*0.5 + 0.2
            var dDuration:Number = Math.ceil(Math.random()*5000) + 1000;

            var d:Sprite = new Sprite();
            d.graphics.beginFill(0x1C75BC,dAlpha);
            d.graphics.drawRect(78, dY, dSize,dSize);
            d.graphics.endFill();

            floatBG.addChild(d);

            var dMove:Move = new Move(d);
            dMove.xBy = 300;
            dMove.duration = dDuration;

            dMove.play();

            var dFade:Fade = new Fade(d);
            dFade.alphaFrom = 1;
            dFade.alphaTo = 0;
            dFade.duration = dDuration;

            dFade.play();

            this.addElement(floatBG);

        }

Кроме того, каков будет лучший / правильный метод уничтожения спрайтов в конце каждого цикла?

Заранее большое спасибо, очень ценю это!

Джош

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

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

Как предположил Брайан,простое введение d в качестве UIComponent, а не sprite, позволило эффекту dMove (я до сих пор не уверен, почему это так, поскольку эффект dFade работал, когда он был еще спрайтом).Однако добавление floatBG (BG является фоном, UIComponent, к которому добавляются все d UIComponents) каждый раз было ненужным, поэтому я сделал this.addElement(floatBG) часть моей creationComplete функции

, а затем столкнулся спроблема в том, что приложение начало заполняться экземплярами d (кстати, d изначально означало «datapoint», что было своего рода темой эффекта, который я пытался создать, шлейф их), и постепенно замедлялаприложение для сканирования.Постоянно добавлять d элементов необходимо, так как это часть логотипа, которая находится в углу экрана и выглядит так красиво, как я могу ...

В конце концов я пришел к следующему решению, суть егодолжен был загрузить floatBG 600 фиктивных UIComponents, а затем с каждым циклом функции addDP добавить движущийся d UIComponent к floatBG и удалить еще один UIComponent из общего массива дочерних элементов, который он содержит.

Таким образом, в итоге это выглядело примерно так:

<?xml version="1.0" encoding="utf-8"?><s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx" creationComplete="init(event)">

<fx:Script>
    <![CDATA[

        import mx.core.DesignLayer;
        import mx.core.UIComponent;
        import mx.effects.effectClasses.MoveInstance;
        import mx.events.EffectEvent;
        import mx.events.FlexEvent;
        import mx.states.RemoveChild;

        import spark.effects.AnimateColor;
        import spark.effects.AnimateFilter;
        import spark.effects.Fade;
        import spark.effects.Move;
        import spark.effects.Rotate;
        import spark.effects.easing.Sine;

        private var floatBG:UIComponent = new UIComponent;

        private var floatColour:uint = 0x1C75BC

        protected function init(event:FlexEvent):void
        {   

            //Float BackGround set up
            floatBG.mask = floatMaskBlock;
            floatBG.depth = -1;

            this.addElement(floatBG);


            //Fill FloatBG with 600 filler elements
                for(var i:int=0; i<600; i++)
                {
                    var filler:UIComponent = new UIComponent;
                    floatBG.addChild(filler);
                }
            //Float Animation Timer

            var floatTimer:Timer = new Timer(1,0);
            floatTimer.addEventListener(TimerEvent.TIMER,DPstartup)
            floatTimer.start();

        private function DPstartup(event:TimerEvent):void
        {
            this.addDP(5,60)
            this.addDP(22,14);
            this.addDP(18,18);
        }

        private function addDP(yf:Number,yt:Number):void
        {   
            this.title.text = floatBG.numChildren.toString();

            var dY:Number = yf+Math.ceil(Math.random()*yt);
            var dXby:Number = Math.ceil(Math.random()*1000 + 50);
            var dSize:Number = Math.ceil(Math.random()*12);
            var dAlpha:Number = Math.random()*0.5 + 0.2
            var dMotionDuration:Number = Math.ceil(Math.random()*15000) + 1000;
            var dFadeDuration:Number = Math.random()*dMotionDuration;

            var d:UIComponent = new UIComponent;

            d.graphics.beginFill(floatColour,dAlpha);
            d.graphics.drawRect(78, dY, dSize,dSize);
            d.graphics.endFill();

            var dMove:Move = new Move(d);
            dMove.xBy = dXby;
            dMove.duration = dMotionDuration;
            dMove.easer = Linear;

            dMove.play();

            var dFade:Fade = new Fade(d);
            dFade.alphaFrom = dAlpha;
            dFade.alphaTo = 0;
            dFade.duration = dFadeDuration;

            dFade.play();

            floatBG.addChild(d);
            floatBG.removeChildAt(0);
        };
    ]]>
</fx:Script>

<fx:Declarations>       
    <s:Sine id="Sine"/>
    <s:Bounce id="Bounce"/>
    <s:Linear id="Linear"/>     
</fx:Declarations>

<s:Group x="88" width="1000" height="80" id="floatMaskBlock">
    <s:Rect width="100%" height="100%">
        <s:fill>
            <s:SolidColor color="0xffffff"/>
        </s:fill>
    </s:Rect>
</s:Group></s:Group>

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

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

Цветобъявляется как переменная в начале, так как я, скорее всего, добавлю функцию, чтобы изменить ее по щелчку или что-то подобное.

Спасибо!

Джош

1 голос
/ 08 февраля 2011

Я запустил это во Flex 4, единственное изменение, которое я сделал, - это использование UIComponent вместо spirte, который работает нормально.Может быть, вы используете чистый проект AS3, хотя?Не уверен насчет уничтожения после игры.

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Script>
        <![CDATA[
            import mx.core.UIComponent;
            import mx.effects.Fade;
            import mx.effects.Move;

            private var floatBG:UIComponent = new UIComponent();

            private function addDP(event:TimerEvent):void{  

                var dY:Number = 5+Math.ceil(Math.random()*60);
                var dSize:Number = Math.ceil(Math.random()*12);
                var dAlpha:Number = Math.random()*0.5 + 0.2
                var dDuration:Number = Math.ceil(Math.random()*5000) + 1000;

                var d:UIComponent = new UIComponent();
                d.graphics.beginFill(0x1C75BC,dAlpha);
                d.graphics.drawRect(78, dY, dSize,dSize);
                d.graphics.endFill();


                floatBG.addChild(d);

                var dMove:Move = new Move(d);
                dMove.xBy = 300;
                dMove.duration = dDuration;

                dMove.play(); 

                var dFade:Fade = new Fade(d);
                dFade.alphaFrom = 1;
                dFade.alphaTo = 0;
                dFade.duration = dDuration;

                dFade.play();

                this.addElement(floatBG);

            }

            private function onClick():void{
                var t:Timer = new Timer(100, 10);
                t.start();
                t.addEventListener(TimerEvent.TIMER, addDP);
            }

        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button click="onClick()" />
</s:Application>
...