Не знаю насчёт того лучший ли это вариант. Но можете попробовать этот способ.
Поясню, способ основан на формуле h = at*t + v0*t;
Где:
1. h(t) - высота объекта в момент времени t.
2. a - вектор ускорения.(в нашем случае он положителен, чтобы тянуть объект вниз).
3. v0 - начальная скорость объекта, тот же вектор, направленный вверх при прыжке объекта.
Регулировать скорость прыжка и тому подобное Вы можете через vFirst = v0 и a. Можно и через startUp, прибавляя больше или меньше к нему, собственно, если будет желание, то найдете оптимальную скорость движения объекта.
Если же Вы хотите, чтобы движение занимало определенный промежуток времени, то можете просто замерить расстояние(
S = (конечная точка - начальная)) и время продолжения(t). А по Event'у в таймере находить отношение времени:
k = (сколько прошло)/(сколько всего двигаться). Ну и вот это отношение (
K) умножать на длину всего пути(
S). Можно еще разделить на 2 пути, до верхней точки и до нижней, думаю особых проблем это не вызовет у Вас. Удачи!
Надеюсь всё понятно, если что - спрашивайте.
Код AS3:
package
{
import flash.display.InteractiveObject;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.display.Shape;
/**
* ...
* @author Vulcan
*/
public class Main extends Sprite
{
private var vFirst:Number = 2;
private var startUp:Number = 1;
private var a:Number = .5;
private var circle:Sprite = new Sprite();
private var groundPos:Number;
public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
circle.graphics.lineStyle(1);
circle.graphics.drawCircle(300, 450, 50);
groundPos = 500;
addChild(circle);
//circle.tabEnabled = true;
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
graphics.lineStyle(1);
graphics.moveTo(0, 500);
graphics.lineTo(500, 500);
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
}
private function keyDownListener(e:KeyboardEvent):void {
trace("UP!");
addEventListener(Event.ENTER_FRAME, enterFrameListener);
stage.removeEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
}
private function enterFrameListener(e:Event):void {
startUp += .1;
circle.y += (a * startUp * startUp) - vFirst * startUp;
if (circle.y >= 0) {
trace(circle.y);
circle.y = 0;
removeEventListener(Event.ENTER_FRAME, enterFrameListener);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
startUp = 1;
}
}
}
}
P.S. Насчёт того, что лучше это всё дело пропускать через Frame я не особо уверен, если нужна наибольшая точность, то можете через Timer всё это реализовать.