Pregunta

Soy nuevo en AS3 y he estado trabajando en un sistema de navegación basado en XML escrito en AS3.

En la actualidad, importé el contenido de un archivo XML y lo tracé dentro de un MovieClip que contiene creado a nivel raíz dinámicamente en el escenario. Este MovieClip se llama 'contenedor'.

Lo que quiero lograr es un efecto suave de aceleración / desaceleración que anime el clip de película del contenedor a lo largo del eje X dependiendo de dónde esté el cursor del mouse en relación con la mitad del escenario.

Mi código se puede encontrar aquí: http://pastie.org/521432

La línea 87 en adelante es el código que estoy usando ahora para hacer que el clip de película se desplace a la izquierda & amp; derecha.

Lo que tengo funciona pero es torpe pero funciona, solo quiero que esté un poco más pulido y haya dejado un espacio en blanco con Google. Como quiero que MovieClip continúe desplazándose a la velocidad relativa actual incluso cuando el mouse deja de moverse, utilicé una instancia de la clase Timer.

¿Alguien puede sugerir mejoras? Gracias de antemano.

¿Fue útil?

Solución

Debe separar sus cálculos y sus métodos de dibujo. Así que haga todos los cálculos en un controlador onMouseMove , pero dibuje los cambios en un controlador onEnterFrame .

También creo que su algoritmo podría ser mucho más simple y nadie lo notaría. Hice un ejemplo rápido de cómo podrías hacerlo. pegue este código en un archivo AS3 llamado Main.as y conviértalo en la clase de documento de un nuevo 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;
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top