Flash CS4 AS3水平动画片段滚动鼠标移动

时间:2009-06-23 11:27:46

标签: actionscript-3 mouse scroll movieclip

我是AS3的新手,一直致力于用AS3编写的XML驱动导航系统。

目前,我已导入XML文件的内容,并将其绘制在舞台上动态创建的包含在根级别的MovieClip内。这个MovieClip被称为'容器'。

我想要实现的是平滑,加速/减速效果,它根据鼠标光标相对于舞台中间的位置,沿X轴动画容器动画片段。

我的代码可在此处找到:http://pastie.org/521432

第87行以后是我正在使用的代码,用于使影片剪辑向左滚动和放大右。

我所做的工作虽然有点笨拙,但确实有效 - 我只是希望它更加精致,并且在Google上留下了空白。因为即使鼠标停止移动,我希望MovieClip继续以当前相对速度滚动,我使用了Timer类的实例。

有人可以建议改进吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

您应该将计算和绘图方法分开。因此,它在 onMouseMove 处理程序中执行所有计算,但实际上是在 onEnterFrame 处理程序中绘制更改。

此外,我认为您的算法可能更简单,没有人会注意到。我快速举了一个例子,说明如何做到这一点。将此代码粘贴到名为 Main.as 的AS3文件中,并将其设为新FLA的文档类

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

    public class Main extends Sprite 
    {
        private const boxCount:int = 10;
        private const boxWidth:int = 45;
        private const boxMargin:int = 5;
        private const startPoint:int = 150;
        private const boxesWidth:int = boxCount * (boxWidth + boxMargin);
        private const endPoint:int = boxesWidth + startPoint;
        private const zeroPoint:int = boxesWidth / 2 + startPoint;

        private var container:MovieClip;
        private var targetX:Number;
        private var speed:Number = 0;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            container = new MovieClip();
            addChild(container);
            container.x = 150;
            container.y = 300;
            for (var i:int = 0; i < boxCount; i++) 
            {
                container.graphics.beginFill(Math.random() * 0xFFFFFF);
                container.graphics.drawRect(i*(boxWidth+boxMargin), 0, boxWidth, boxWidth);
            }

            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
            stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
        }

        private function mouseMoveHandler(e:MouseEvent):void 
        {
            var distanceFromCenter:int = stage.mouseX - zeroPoint;
            speed = distanceFromCenter * -0.01; // Bring number into a good range, and invert it.
        }

        private function enterFrameHandler(e:Event):void 
        {
            container.x += speed;
        }
    }
}