Domanda

Ho un timerEvent che aggiunge 25 filmati sul palco e li anima da x: 0, y: 0, tutto funziona bene! Quello che vorrei fare è assegnare ad ogni clip filmato un valore y di 25px in più rispetto all'ultimo MovieClip aggiunto allo stage. Ho fatto un piccolo test cercando di incrementare un valore numerico ogni volta che il timer ha fatto un ciclo ma non ha incrementato. Dovrei usare anche un ciclo / array?

Grazie in anticipo. Jono

import flash.events.*;
import caurina.transitions.*;

bringItemsOn();

var itemTimer:Timer;
function bringItemsOn():void {
    itemTimer=new Timer(300);
    itemTimer.addEventListener(TimerEvent.TIMER,itemTimer_tick);
    itemTimer.start();
}

function itemTimer_tick(e:TimerEvent):void {    
    itemTimer.currentCount-1;
    var mc:MovieClip = new MovieClip();
    mc.graphics.beginFill(Math.random() * 0x000000);
    mc.graphics.drawRect(0,0,stage.stageWidth,25);
    mc.x=0;
    mc.y=0;
    addChild(mc);
    Tweener.addTween(mc,{y:Math.random()*1000 - 500,
                             x:0,
                             time:.9,
                             transition:"easeOutExpo"});

    if (itemTimer.currentCount>=25) {
        itemTimer.removeEventListener(TimerEvent.TIMER,itemTimer_tick);
    }
}
È stato utile?

Soluzione

Sinceramente avrei impostato tutto inizialmente con un ciclo for. Una volta terminato il ciclo for, posizionando ciascun elemento di conseguenza, quindi utilizzare TweenLite o il pacchetto Tweening preferito.

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    import gs.TweenLite;
    import gs.easing.*;

    public class ExampleDocumentClass extends Sprite
    {
        if(stage) _init();
        else addEventListener(Event.ADDED_TO_STAGE, _init(), false, 0, true);
    }
    private function _init(e:Event =null):void
    {
        for(var i:int = 0; i < 25; i++)
        {
            var mc:MovieClip = new MovieClip();
            mc.graphics.beginFill(Math.random() * 0x000000);
            mc.graphics.drawRect(0,0,stage.stageWidth,25);
            //Seperates them by 25, their width, so they will touch.
            mc.x= i * 25; //i * 25 + 1 leaves a space in between.
            mc.y=0;
            addChild(mc);
            TweenLite.to(mc, 0.9, {y:math.random()*1000-500, x: 0, ease: Expo.easeOut});

        if(i == 24) //Total length - 1
        {
            //The loop ended.
        }
    }
}

È importante notare che gli aggiornamenti dello schermo NON avvengono all'interno di blocchi di codice come per e mentre i cicli. Non è possibile distanziarli in base l'uno all'altro nel modo che ho mostrato perché anche se gli elementi precedenti x potrebbero essere stati appena impostati, non è stato disegnato sullo schermo; Per costruire un sistema in cui si dice che tutte le immagini non hanno la stessa larghezza, eppure bisogna iniziare dopo l'altra, dobbiamo attendere che l'evento Event.COMPLETE venga attivato per il caricatore specificato, in modo da poter accedere alla sua larghezza e altro attributi. Dal momento che volevi solo distanziarli di 25 pixel, e hanno le stesse dimensioni, utilizziamo semplicemente " i " per separarli

Cosa sta succedendo: i * 25 = 0; i ++; i * 25 = 25; i ++; i * 25 = 50;

come puoi vedere abbiamo raggiunto la distanza che stavamo cercando.

Brian Hodge
hodgedev.com blog.hodgedev.com

Altri suggerimenti

usa questo:

 import flash.events.*;
 import caurina.transitions.*;

bringItemsOn();

var extra:int = 0;
var itemTimer:Timer;
function bringItemsOn():void {
    itemTimer=new Timer(300);
    itemTimer.addEventListener(TimerEvent.TIMER,itemTimer_tick);
    itemTimer.start();
}

function itemTimer_tick(e:TimerEvent):void {    
    itemTimer.currentCount-1;
    var mc:MovieClip = new MovieClip();
    mc.graphics.beginFill(Math.random() * 0x000000);
    mc.graphics.drawRect(0,0,stage.stageWidth,25);
    mc.x += extra;
    mc.y=0;
    extra = mc.width;
 /*u can use mc's width for different x value's or

make ur own like extra += 10; each mc.x will be different */
    addChild(mc);
    Tweener.addTween(mc,{y:Math.random()*1000 - 500,
                             x:0,
                             time:.9,
                             transition:"easeOutExpo"});

    if (itemTimer.currentCount>=25) {
        itemTimer.removeEventListener(TimerEvent.TIMER,itemTimer_tick);
    }
}

Non hai davvero localizzato la parte in cui hai provato ad incrementare una variabile o ad aggiungere 25px a y, ma prova questo:

function itemTimer_tick(e:TimerEvent):void {

    ...

    mc.y = itemTimer.currentCount * 25;
    addChild(mc);

    ...

}

Un approccio davvero diverso potrebbe essere l'uso della proprietà delay del metodo Tweener.addTween . Avviare tutti i filmati e aumentare leggermente il ritardo di ognuno?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top