在保持底部(Y)位置的同时塑造补间/变换?

时间:2011-06-28 16:56:33

标签: flash actionscript-3 transform tween

我正试图在火箭爆炸的影片剪辑中塑造。我希望它在升空之前“挤压”,然后在它抬起时“拉伸”。

当我在时间轴上使用变换工具对其进行补间时,我可以“压缩”火箭,并且火箭底座停留在“地面”上。这就是我要的。但是,由于我不会进入的原因,我需要在AS3中执行此操作,而不是在时间轴上执行此操作。但是,当我使用“高度”补间时,动画片段高度会发生变化,但会在底部收缩/拉伸(锁定在顶部)。

是否可以使用补间类做我想要的?我需要使用“身高”以外的东西吗?

我应该使用变换矩阵吗?如果我使用变换矩阵,我可以补间吗? (我对变换基质没有太多经验。)

这是我用于伸展的补间:

var tweenPlayer1:Tween = new Tween(mc_player, "height", Strong.easeOut, mc_player.height, mc_player.height+100, 2, true);

3 个答案:

答案 0 :(得分:1)

可能有更好的方法来处理startingYandHeight,但这对你有用

import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;

var startingYandHeight:Number = mc_player.y + mc_player.height;

var myTween:Tween = new Tween(mc_player, "height", Strong.easeOut, mc_player.height, mc_player.height + 100, 2, true);
myTween.addEventListener( TweenEvent.MOTION_CHANGE, onChange);

function onChange( e:TweenEvent ):void{
    mc_player.y = startingYandHeight - mc_player.height;
}

答案 1 :(得分:0)

问题可能在于您在FLA中将影片固定在movieclip对象内部的位置。如果您调整图形以使其底部对齐,例如在movieclip内部的graphic.y = -graphic.height,则Y轴上的缩放应该只是从底部而不是从顶部推动图形。

答案 2 :(得分:0)

如上所述,这是另一种方法。这与更改注册点具有相同的效果,而不必担心处理子组件和层。

根据我在此处找到的教程:http://theflashconnection.com/content/how-to-change-registration-point-as3#viewSource

var heightChange:int = 200;

setRegPoint(mc_player, 0, mc_player.height);

var myTween:Tween = new Tween(mc_player,"height",Strong.easeOut,mc_player.height,mc_player.height - heightChange,2,true);

function setRegPoint(obj:DisplayObjectContainer, newX:Number, newY:Number):void {
    //get the bounds of the object and the location 
    //of the current registration point in relation
    //to the upper left corner of the graphical content
    //note: this is a PSEUDO currentRegX and currentRegY, as the 
    //registration point of a display object is ALWAYS (0, 0):
    var bounds:Rectangle = obj.getBounds(obj.parent);
    var currentRegX:Number = obj.x - bounds.left;
    var currentRegY:Number = obj.y - bounds.top;

    var xOffset:Number = newX - currentRegX;
    var yOffset:Number = newY - currentRegY;
    //shift the object to its new location--
    //this will put it back in the same position
    //where it started (that is, VISUALLY anyway):
    obj.x += xOffset;
    obj.y += yOffset;

    //shift all the children the same amount,
    //but in the opposite direction
    for(var i:int = 0; i < obj.numChildren; i++) {
        obj.getChildAt(i).x -= xOffset;
        obj.getChildAt(i).y -= yOffset;
    }
}