0

我正在尝试对火箭爆炸的电影剪辑进行补间。我希望它在起飞前“挤压”,然后在起飞时“拉伸”。

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

补间班可以做我想做的事吗?除了“高度”之外,我还需要使用其他东西吗?

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

这是我用于拉伸的补间:

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

3 回答 3

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;
}
于 2011-06-28T19:24:06.970 回答
0

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

于 2011-06-28T17:19:50.717 回答
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;
    }
}
于 2011-07-01T19:31:29.987 回答