Горизонтальная прокрутка ролика Flash CS4 AS3 движением мыши - PullRequest
2 голосов
/ 23 июня 2009

Я новичок в AS3 и работаю над системой навигации на основе XML, написанной на AS3.

В настоящее время я импортировал содержимое файла XML и нанес его на график внутри содержащего MovieClip, динамически создаваемого на уровне root. Этот мувиклип называется «контейнер».

То, чего я хочу добиться, это плавный, ускоряющий / замедляющий эффект, который анимирует видеоклип контейнера по оси X в зависимости от того, где находится курсор мыши относительно середины сцены.

Мой код можно найти здесь: http://pastie.org/521432

Строка 87 и далее - это код, который я сейчас использую для прокрутки видеоклипа влево и вправо.

То, что у меня есть, работает, но неуклюже, но работает - я просто хочу, чтобы оно было немного более отточенным и вычеркнуло пустое место с Google. Поскольку я хочу, чтобы MovieClip продолжал прокручиваться с текущей относительной скоростью, даже когда мышь перестает двигаться, я использовал экземпляр класса Timer.

Может кто-нибудь предложить улучшения? Заранее спасибо.

1 Ответ

4 голосов
/ 25 июня 2009

Вы должны разделить ваши расчеты и методы рисования. Поэтому пусть он выполняет все вычисления в обработчике onMouseMove , но фактически отображает изменения в обработчике onEnterFrame .

Также я думаю, что ваш алгоритм может быть намного проще, и никто не заметит. Я сделал быстрый пример того, как вы можете это сделать. вставьте этот код в файл AS3 с именем Main.as и сделайте его классом документов нового 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;
        }
    }
}
...