我正试图在火箭爆炸的影片剪辑中塑造。我希望它在升空之前“挤压”,然后在它抬起时“拉伸”。
当我在时间轴上使用变换工具对其进行补间时,我可以“压缩”火箭,并且火箭底座停留在“地面”上。这就是我要的。但是,由于我不会进入的原因,我需要在AS3中执行此操作,而不是在时间轴上执行此操作。但是,当我使用“高度”补间时,动画片段高度会发生变化,但会在底部收缩/拉伸(锁定在顶部)。
是否可以使用补间类做我想要的?我需要使用“身高”以外的东西吗?
我应该使用变换矩阵吗?如果我使用变换矩阵,我可以补间吗? (我对变换基质没有太多经验。)
这是我用于伸展的补间:
var tweenPlayer1:Tween = new Tween(mc_player, "height", Strong.easeOut, mc_player.height, mc_player.height+100, 2, true);
答案 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;
}
}