Frage

Ich bin neu in AS3 und habe in AS3 auf einem XML-gesteuerten Navigationssystem geschrieben worden zu arbeiten.

Zur Zeit habe ich den Inhalt einer XML-Datei importiert und geplottet es in einer enthält MovieClip- auf Root-Ebene erstellt dynamisch auf der Bühne. Diese MovieClip- heißt 'Container'.

Was ich erreichen will ist eine glatte, Beschleunigungs- / Verzögerungseffekt, der den Behälter MovieClip- entlang der X-Achse beseelt je nachdem, wo sich der Mauszeiger in Bezug auf die Mitte der Bühne ist.

Mein Code kann hier gefunden werden: http://pastie.org/521432

Zeile 87 ff ist der Code, den ich jetzt bin mit auf den Movieclip Scroll machen links & rechts.

Was ich habe funktioniert, aber ist klobig, aber funktioniert - ich will es nur ein wenig mehr poliert sein und haben sich zu einem Rohling mit Google gezogen. Weil ich die MovieClip- weiter blättern in der aktuellen Relativgeschwindigkeit auch will, wenn die Maus nicht mehr bewegt, habe ich eine Instanz der Timer-Klasse.

Kann jemand Verbesserungen vorschlagen? Vielen Dank im Voraus.

War es hilfreich?

Lösung

Sie sollten Sie Berechnungen und Ihre Ziehverfahren abzutrennen. So haben es in einem onMouseMove Handler alle Berechnungen tun, sondern ziehen die Änderungen tatsächlich in einem onEnterFrame Handler.

Auch ich denke, Ihr Algorithmus viel einfacher sein könnte, und niemand würde es merken. Ich habe ein kleines Beispiel dafür, wie Sie es tun könnten. Fügen Sie diesen Code in eine AS3 Datei mit dem Namen Main.as und macht ihm die Dokumentklasse eine neuen 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;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top