Показать сообщение отдельно
Старый 28.05.2013, 17:39
Idon'tKnow вне форума Посмотреть профиль Отправить личное сообщение для Idon'tKnow Найти все сообщения от Idon'tKnow
  № 2  
Ответить с цитированием
Idon'tKnow

Регистрация: Apr 2013
Сообщений: 77
Не знаю насчёт того лучший ли это вариант. Но можете попробовать этот способ.
Поясню, способ основан на формуле 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 всё это реализовать.


Последний раз редактировалось Idon'tKnow; 28.05.2013 в 17:51.