【问题标题】:Flash CS4 AS3 horizontal movieclip scrolling with mouse moveFlash CS4 AS3 水平动画剪辑滚动鼠标移动
【发布时间】:2010-11-05 03:25:36
【问题描述】:

我是 AS3 的新手,一直在研究用 AS3 编写的 XML 驱动的导航系统。

目前,我已导入 XML 文件的内容并将其绘制在包含在舞台上以根级别动态创建的 MovieClip 中。此影片剪辑称为“容器”。

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

我的代码可以在这里找到:http://pastie.org/521432

第 87 行以后的代码是我现在用来使影片剪辑左右滚动的代码。

我所拥有的东西确实有效,但很笨重,但确实有效 - 我只是希望它更精致一点,并在 Google 上画了一个空白。因为我希望即使鼠标停止移动,MovieClip 也能继续以当前的相对速度滚动,所以我使用了 Timer 类的实例。

谁能提出改进建议?提前致谢。

【问题讨论】:

    标签: actionscript-3 mouse scroll movieclip


    【解决方案1】:

    您应该将计算和绘图方法分开。所以让它在 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;
            }
        }
    }
    

    【讨论】:

    • 非常感谢这段代码。它真的很好用!我以前没有使用过 DocumentClass 设置——我喜欢将 ActionScript 从 FLA 中分离出来的方式。我现在正在调整代码 - 我遇到的唯一问题是 zeroPoint 和 distanceFromCenter 计算......似乎向左滚动效果很好,但如果我添加更多框并尝试向右滚动,速度确实不增加?
    • 其实忽略上面的,我已经修好了——我把'const zeroPoint'的声明(第16行)改成了:private const zeroPoint:int = stage.stageWidth / 2 + startPoint
    • 如何修改此代码,使其像旋转木马一样运行——在滚动到最后一个框后自动绘制第一个框?是否也可以在鼠标不在舞台内时自动滚动?
    • 我成功了!可能不是我知道的最好方法,但请查看我的代码:pastie.org/579689
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多