Desplazamiento de clip de película horizontal Flash CS4 AS3 con movimiento del mouse
-
06-07-2019 - |
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.
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;
}
}
}