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

Actionscript 3 在多个点之间平滑地移动和缩放MovieClip,actionscript-3,actionscript,scale,game-physics,point,Actionscript 3,Actionscript,Scale,Game Physics,Point,我有一个3行的设置,每个行有一个对齐的按钮,还有一个字符(以每行为中心),我想在这些行之间移动(想想小行星)。我能够对其进行编程,使角色在3行之间移动,并在移动时具有设定的比例,但我希望看到角色在点之间实际移动;不仅仅是看着它传送到那个地方。我已经尝试了我能想到的一切:循环、布尔开/关、一些速度/距离/差的诡计等等,但是我没有成功让它在点击按钮时移动,并继续移动,直到到达它的点。我也不确定是否可以将其设置为增量缩放,直到达到所需的最终缩放大小。我在一个网站上看到了一个稍微相似的问题,但他们给出的

我有一个3行的设置,每个行有一个对齐的按钮,还有一个字符(以每行为中心),我想在这些行之间移动(想想小行星)。我能够对其进行编程,使角色在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;
            }
        }
    }
}
包
{
导入flash.display.MovieClip;
导入flash.events.Event;
导入flash.events.MouseEvent;
公共类主测试扩展了MovieClip
{
私有变量cam:MovieClip=新的MovieClip();
私有变量玩家:玩家=新玩家();
私有var位置:uint=170;
专用var中心位置:uint=270;
私有var底部位置:uint=370;
私有变量UI:UserInterface=newuserinterface();
私有变量testBackground:testBackground=newtestbackground();
公共函数Main_Test_5():void
{
player.x=100;
player.y=370;
游戏玩家;
addChild(UI);
//添加事件侦听器
stage.addEventListener(Event.ENTER_FRAME,checkEveryFrame);
UI.topButton.addEventListener(MouseEvent.CLICK,topButton单击);
UI.centerButton.addEventListener(MouseEvent.CLICK,centerButton单击);
UI.bottomButton.addEventListener(MouseEvent.CLICK,bottomButtonClick);
addChild(cam);
}
公共函数checkEveryFrame(事件:事件):无效
{
cam.x-=player.x-player.x;
cam.y-=player.y-player.y;
}
公共功能TopButton单击(事件:MouseeEvent):无效
{
跟踪(“顶部点击”);
如果(player.y>topPosition)//170,则player.y从370开始
{
player.y-=100;
}
else if(player.y中心位置)//270
{
player.y-=100;
}
if(游戏者y<中心位置)
{
player.y+=100;
}
如果(player.y==中心位置)
{
player.scaleY=0.9;
player.scaleX=0.9;
}
}
公共函数底部按钮单击(事件:MouseEvent):无效
{
跟踪(“底部点击”);
if(player.y=底部位置)
{
player.y=底部位置;
}
if(player.y==底部位置)
{
player.scaleY=1;
player.scaleX=1;
}
else if(player.y!=底部位置)
{
player.scaleY=0.9;
player.scaleX=0.9;
}
}
}
}

听起来你想要一些简单的东西。所以我建议使用Tweening库。其中产量最高的是

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

代替:

player.y += 100;
你会做:

TweenLite.to(player, 1,{y: player.y + 100, ease: Quad.EaseInOut});
这将使玩家对象从当前位置移动到指定的y(player.y+100)。它将在1秒钟内完成,并且具有很好的进进出出的轻松性

你可以添加更多的属性到tween(scaleX/Y,x)中



请注意,有许多Tweening平台可供选择,包括一个烘焙到Flash Professional中的平台。如果您向最终用户收取应用程序费用,则TweenLite不能免费使用。如果您在商业上使用许可证,请务必查看许可证。

谢谢大家的帮助。你们一提到tweening程序,我就对tweening做了一些研究,flash有一个内置的tweening系统,可以完美地满足我的需要。玩了几天后,我解决了这个问题。