在多个点之间平滑地移动和缩放 MovieClip

Move and Scale a MovieClip smoothly between multiple points

我设置了 3 行水平行,每行都有一个对齐的按钮和一个我想在这些行之间移动的角色(每行居中)(想想 Little Big Planet)。我能够对其进行编程,使角色在 3 行之间移动并在移动时具有设定的比例,但我想看到角色实际上在各点之间移动;不只是看着它传送到该位置。我已经尝试了所有我能想到的方法:循环、布尔值 on/off、一些 velocity/distance/difference 恶作剧等,但我没有成功让它在单击按钮时移动并继续移动直到它达到目的。我也不确定是否可以将它设置为逐步缩放,直到达到所需的最终比例大小。我在一个网站上看到了一个稍微类似的问题,但是他们给出的解决方案使用了 Point class 和大量的数学,而且我从来没有成功地让我的 Flash 使用 Points。如有任何建议,我们将不胜感激。

package
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class Main_Test_5 extends MovieClip
    {
        private var cam:MovieClip = new MovieClip();
        private var player:Player = new Player();
        private var topPosition:uint = 170;
        private var centerPosition:uint = 270;
        private var bottomPosition:uint = 370;
        private var UI:UserInterface = new UserInterface();
        private var testBackground:TestBackground = new TestBackground();

        public function Main_Test_5():void
        {
            player.x = 100;
            player.y = 370;
            cam.addChild(player);
            addChild (UI);

            // add event listeners
            stage.addEventListener(Event.ENTER_FRAME, checkEveryFrame);
            UI.topButton.addEventListener(MouseEvent.CLICK, topButtonClick);
            UI.centerButton.addEventListener(MouseEvent.CLICK, centerButtonClick);
            UI.bottomButton.addEventListener(MouseEvent.CLICK, bottomButtonClick);
            addChild (cam);
        }

        public function checkEveryFrame(event:Event):void
        {
            cam.x -= player.x - player.x;
            cam.y -= player.y - player.y;
        }
        public function topButtonClick (event:MouseEvent):void
        {
            trace ("Top Click");
            if (player.y > topPosition) // 170, player.y starts at 370
            {
                player.y -= 100;
            }
            else if (player.y <= topPosition)
            {
                player.y = topPosition;
            }
            if (player.y == topPosition)
            {
                player.scaleY = 0.8;
                player.scaleX = 0.8;
            }
            else if (player.y != topPosition)
            {
                player.scaleY = 0.9;
                player.scaleX = 0.9;
            }
        }
        public function centerButtonClick (event:MouseEvent):void
        {
            trace ("Center Click");
            if (player.y > centerPosition) // 270
            {
                player.y -= 100;
            }
            if (player.y < centerPosition)
            {
                player.y += 100;
            }
            if (player.y == centerPosition)
            {
                player.scaleY = 0.9;
                player.scaleX = 0.9;
            }
        }
        public function bottomButtonClick (event:MouseEvent):void
        {
            trace ("Bottom Click");
            if (player.y < bottomPosition) // 370
            {
                player.y += 100;
            }
            if (player.y >= bottomPosition)
            {
                player.y = bottomPosition;
            }
            if (player.y == bottomPosition)
            {
                player.scaleY = 1;
                player.scaleX = 1;
            }
            else if (player.y != bottomPosition)
            {
                player.scaleY = 0.9;
                player.scaleX = 0.9;
            }
        }
    }
}

听起来你喜欢简单的东西。所以我建议使用 Tweening 库。其中最多产的是Greensocks TweenLite, which is now part of their Animation Platform

使用 tweenlite,您只需执行以下操作:

代替:

player.y += 100;

你会做:

TweenLite.to(player, 1,{y: player.y + 100, ease: Quad.EaseInOut});

这会将您的玩家对象从当前位置补间(随着时间逐渐移动)到指定的 y (player.y + 100)。它会在 1 秒内完成,并且进出起来很轻松。

您可以向补间 (scaleX/Y, x) 添加更多属性。


请注意,有许多 Tweening 平台替代品,包括内置于 Flash Professional 中的一个。如果您向最终用户收取应用程序费用,TweenLite 就不能免费使用。如果您将其用于商业用途,请务必查看他们的许可证。