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

时间:2015-04-14 22:28:23

标签: actionscript-3 actionscript scale game-physics point

我有一个3个水平行的设置,每个水平行对齐一个按钮,并且我想在这些行之间移动一个字符(以每行为中心)(想想Little Big Planet)。我能够对它进行编程,以便角色在3行之间移动并且具有设定的比例,但是我希望看到角色实际在点之间移动;不只是看它传送到该位置。我已经尝试了我能想到的一切:循环,布尔开/关,一些速度/距离/差异恶作剧等,但我没有成功让它按下按钮点击并继续移动直到它到达它点。我也不确定它是否可以设置为逐步缩放,直到达到所需的最终刻度尺寸。我在一个网站上看到了一个稍微类似的问题,但是他们给出的解决方案使用了Point类和大量的数学,而且我从来没有成功让我的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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

听起来你喜欢简单的事情。所以我建议使用补间库。最多产的是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)添加更多属性。


请注意,有许多补间平台替代品,包括一个融入Flash Professional的替代品。如果您向最终用户收取申请费用,TweenLite将无法免费使用。如果您在商业上使用它,请务必查看其许可证。