Avatar billede Rasmus Lund Nybegynder
18. december 2005 - 23:13 Der er 2 kommentarer

styre tween vha actionscript

Jeg er ved at lave et website, hvor der er nogle kasser, der skal skifte størelse når man trykker på dem. Det fungere fint enkeltvis. Jeg ønsker nu at de tjekker på hinanden, for at se om nogen af de andre er udvidet. Hvis en anden kasse en den man trykker på er udvidet, skal den først tweene tilbage til udgangspunktet, hvorefter den kasse man trykkede på skal udvide sig. Der må altså ikke ske overlap. den der udvider sig, skal først starte animationen når den andens animation er færdig.

Jeg styrer anmationen vha. følgende actionscript:

on (release) {
    import mx.transitions.Tween;
    import mx.transitions.easing.*;
    if (_global.i == 1) {
        var xScaleTind:Tween = new Tween(_root.blaa, "_xscale", Elastic.easeOut, 200, 100, 1, true);
        var yScaleTind:Tween = new Tween(_root.blaa, "_yscale", Elastic.easeOut, 200, 100, 1, true);
        xScaleT.onMotionFinished = function() {
        };
        yScaleT.onMotionFinished = function() {
        };
        trace(i);
    }
    if (_global.i == 0) {
        var xScaleT:Tween = new Tween(_root.blaa, "_xscale", Elastic.easeOut, 100, 200, 1, true);
        var yScaleT:Tween = new Tween(_root.blaa, "_yscale", Elastic.easeOut, 100, 200, 1, true);
        xScaleT.onMotionFinished = function() {
        };
        yScaleT.onMotionFinished = function() {
        };
        trace(i);
    }
    if (_global.i == 0) {
        _global.i = 1;
    } else {
        _global.i = 0;
    }
}
Avatar billede apache999 Nybegynder
23. december 2005 - 09:32 #1
Det rigtig smarte ved Tween-klassen er jo de event handlers, som jeg kan se, du ikke implementerer.

Fremgangsmåden vil være, at du laver en eller anden variabel, som fortæller, hvilken kasse, der PT er aktiv (udvidet). Hvis vi så forestiller os, at dine kasser er lavet vha. en eller anden klasse, så skal der ved klik på en kasse ske det, at den kasse, der PT er den aktive, udfører sin ud-animation (som du laver til en del af klassen). Du sørger så for at fange dens onMotionFinished event (for den ene eller den anden tween, de burde køre lige hurtigt), hvorpå du sætter det nyligt klikke movieclip til at være det aktive og beder det udføre sin ind-animation.

I forhold til den kode, du har nu, vil det rigtig smarte være at lave det om til klasser, men dit navn taget i betragtning burde det være en smal sag ;)
Avatar billede apache999 Nybegynder
23. december 2005 - 10:27 #2
Da jeg alligevel ikke har bedre at tage mig til, har jeg lavet et eksempel. Først koden på den .fla, der bruger klassen, dernæst koden til klassen TweenBox. Du sørger selvfølgelig for at placere din tweenboxes, som det passer dig, jeg har bare placeret dem vha. af en for-løkke.

Løsningen er egentlig ikke så elegant endda - gad godt have lavet noget lidt pænere callBack-halløj, men som det er nu, udløser onMotionFinished en function i det movieclip, der har instantieret klassen, i dette tilfælde _level0.

.fla:
-----------
var tboxes:Array = new Array();
var xPlacer:Number = 20;
var yPlacer:Number = 50;
var thisRoot:MovieClip = this;
var activeTweenBox:TweenBox;
var nextTweenBox:TweenBox;
var thisBox:TweenBox;

function performNextIn():Void {
    activeTweenBox = nextTweenBox;
    activeTweenBox.doInAnim();
}

for(var i:Number = 10;i<14;i++) {
    thisBox = TweenBox.createTweenBox("tbox"+i,thisRoot,i,xPlacer,yPlacer);
    tboxes.push(thisBox);
    xPlacer += 125;
    thisBox.onRelease = function() {
        if(activeTweenBox == undefined) {
            activeTweenBox = this;
            this.doInAnim();
        } else {
            nextTweenBox = this;
            activeTweenBox.doOutAnim();
        }
    }
}



TweenBox.as
--------------------------
import mx.transitions.Tween;
import mx.transitions.easing.*
import mx.utils.Delegate;

class TweenBox extends MovieClip{
   
    var xTween:Tween;
    var yTween:Tween;
    var containerClip:MovieClip;
   
    public function TweenBox() {
       
    }

      public static function createTweenBox (name:String, target:MovieClip,
                                      depth:Number, x:Number,
                                      y:Number):TweenBox {
        var tb:TweenBox = TweenBox(target.attachMovie("TweenBoxSymbol", name, depth));
        tb.init(x, y,target);
        return tb;
      }
   
    private function init (x:Number, y:Number,target:MovieClip):Void {
        this._x = x;
        this._y = y;
        this.containerClip = target;
    }
   
    public function doInAnim():Void {
        xTween = new Tween(this, "_xscale", Elastic.easeOut, 100, 200, 1, true);
        yTween = new Tween(this, "_yscale", Elastic.easeOut, 100, 200, 1, true);
    }
   
    public function doOutAnim():Void {
        xTween = new Tween(this, "_xscale", Elastic.easeOut, 200, 100, 1, true)
        yTween = new Tween(this, "_yscale", Elastic.easeOut, 200, 100, 1, true)
        xTween.onMotionFinished = mx.utils.Delegate.create(this,handleFinish);
    }

    public function handleFinish():Void {
        containerClip.performNextIn();
    }

}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester