He estado tratando de resolver este problema por un tiempo y buscando soluciones en línea sin ningún efecto.

Básicamente, si tengo un sprite, por ejemplo, ubicado en (10,10), quiero moverlo para decir (50,100) y todo el proceso tomará 2 segundos o la duración que especifique. ¿Cuál es la matemática exacta detrás de esto? Estaba usando una solución basada en la distancia para determinar la velocidad, pero solo estaba usando un modificador aleatorio para controlar el proceso. Necesito algo más preciso para ejecutar exactamente durante un período determinado.

¡Cualquier ayuda sobre este tema sería muy apreciada!

1
Stefan Woskowiak 21 jun. 2011 a las 23:16

4 respuestas

La mejor respuesta

Suponiendo una interpolación lineal (es decir, moviéndose en línea recta desde la posición inicial a la posición final a una velocidad constante):

El vector desde el inicio hasta el destino es destino - inicio, es decir, para su ejemplo (40,90).

Si desea que esto suceda durante dos segundos, debe dividirlo por dos para obtener la distancia recorrida por segundo, entonces (20,45) por segundo para su ejemplo.

Para obtener la posición en un momento dado, primero registre la hora de inicio y calcule la hora actual menos la hora de inicio en segundos. Entonces, si la animación comenzó a las 12: 01: 30.000 y ahora son las 12: 01: 31.500, entonces han pasado 1.5 segundos desde el comienzo de la animación.

Para obtener la ubicación actual, agregue la ubicación de inicio al vector de movimiento por segundo * el tiempo transcurrido, así que en mi ejemplo:

(10,10) + (20,45) * 1.5 = (10,10) + (30, 67.5) = (40, 77.5)

4
Jackson Pope 21 jun. 2011 a las 19:23

Es solo una cuestión de interpolación y tiempo. Hay lineal, sinusal, cuadrática, ...

Aquí hay más información y ejemplos en actionscript: enlace

0
Pillum 21 jun. 2011 a las 19:22

Eche un vistazo más de cerca a los algoritmos de animación de jQuery ... tal vez pueda usar parte del código.

http://code.jquery.com/jquery-1.6.1.js (busque "personalizado:" como punto de partida).

0
Leonhardt Wille 21 jun. 2011 a las 19:27

Necesita un par de datos para hacer esto, ubicación de inicio, ubicación final, duración y tiempo transcurrido.

Aquí hay un ejemplo en actionscript:

package {
    import flash.utils.getTimer;
    import flash.events.Event;
    import flash.display.Shape;
    import flash.geom.Point;
    import flash.display.Sprite;

    public class Mover extends Sprite {

        private var circle      :Shape;
        private var start       :Point;
        private var end         :Point;
        private var duration    :int;

        public function Mover() {

            // first we create something to move, like, a circle
            circle = new Shape();
            circle.graphics.beginFill(0xff00ff);
            circle.graphics.drawCircle(0, 0, 20);
            addChild(circle);

            // start and end positions
            start = new Point(0, 0);
            end = new Point(100, 100);

            // and finally, the duration, i'm using milliseconds
            duration = 2000;

            // this event handler will run each frame
            addEventListener(Event.ENTER_FRAME, handleEnterFrame);
        }

        private function handleEnterFrame(event:Event):void {
            // we figure out how much of the animation has elapsed by using getTimer
            // should you want to use a start time, add it here 
            var progress:Number = getTimer() / duration;

            // we need to clamp our progress so we don't under- or overshoot the target
            if(progress < 0) progress = 0;
            if(progress > 1) progress = 1;


            // then it's a matter of setting the position
            // we use the start position as a base and then gradually add in 
            // the difference between the start and the end
            circle.x = start.x + (end.x - start.x) * progress;
            circle.y = start.y + (end.y - start.y) * progress;  
        }
    }
}

Si no está tan interesado en el cómo y solo quiere los resultados, le recomiendo sinceramente un motor de interpolación como TweenLite o cualquiera de los muchos otros. Solo manténgase alejado del que viene con flash, es un poco basura.

0
grapefrukt 21 jun. 2011 a las 20:25