Тема: Drag/drop
Показать сообщение отдельно
Старый 13.12.2014, 15:11
stas0 вне форума Посмотреть профиль Отправить личное сообщение для stas0 Найти все сообщения от stas0
  № 1  
Ответить с цитированием
stas0

Регистрация: Dec 2013
Сообщений: 34
По умолчанию Drag/drop

Проблема заключается в том, что при очень быстром движении "пальца" возбуждается событие OUT. Мне нужно этого избежать. Как это исправить?
Код AS3:
package
{
	import flash.display.*;
	import flash.events.*;
 
	public class Inertia extends MovieClip
	{
		private var inertObj:MovieClip;
		private var friction:Number = .96;
 
		public function Inertia( _obj:MovieClip ):void
		{
			this.inertObj = _obj;
		}
 
		public function set setFriction( _friction:Number ):void
		{
				//	Трение в пределах 0..1
			if( _friction > 1 )
				friction = 1;
			else
			if( _friction < 0 )
				friction = 0;
			else
				friction = _friction;
		}
 
		public function get getFriction( ):Number
		{
			return friction;
		}
 
			//	Установить инерцию
		public function setInertia( ):void
		{
				//	Позиции
			var oldX:Number = 0;
			var oldY:Number = 0;
			var newX:Number = 0;
			var newY:Number = 0;
			var xSpeed,ySpeed:Number;
			var offsetX,offsetY:Number;
 
			inertObj.addEventListener( TouchEvent.TOUCH_BEGIN, _beginDrag );
 
			function _beginDrag( e:TouchEvent ):void
			{
				offsetX = e.localX;
				offsetY = e.localY;
 
				inertObj.addEventListener( TouchEvent.TOUCH_END, _endDrag );
				inertObj.addEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );
				inertObj.addEventListener( TouchEvent.TOUCH_OUT, _outDrag );
				inertObj.startTouchDrag( e.touchPointID );
 
				inertObj.removeEventListener( Event.ENTER_FRAME, _moveInert );
			}
 
			function _outDrag( e:TouchEvent ):void
			{
				inertObj.removeEventListener( TouchEvent.TOUCH_OUT, _outDrag );
				inertObj.removeEventListener( TouchEvent.TOUCH_END, _endDrag );
				inertObj.removeEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );
				inertObj.stopTouchDrag( e.touchPointID );
 
				inertObj.addEventListener( Event.ENTER_FRAME, _moveInert );
			}
 
			function _endDrag( e:TouchEvent ):void
			{
				inertObj.removeEventListener( TouchEvent.TOUCH_END, _endDrag );
				inertObj.removeEventListener( TouchEvent.TOUCH_OUT, _outDrag );
				inertObj.removeEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );
				inertObj.stopTouchDrag( e.touchPointID );
 
				inertObj.addEventListener( Event.ENTER_FRAME, _moveInert );
			}
 
			function _moveDrag( e:TouchEvent ):void
			{
				newX = e.stageX;
				xSpeed = newX - oldX;
				oldX = newX;
 
				newY = e.stageY;
				ySpeed = newY - oldY;
				oldY = newY;
			}
 
			function _moveInert( e:Event ):void
			{
				inertObj.x += xSpeed;
				inertObj.y += ySpeed;
 
				xSpeed *= friction;
				ySpeed *= friction;
 
				if(inertObj.x > stage.stageWidth - inertObj.width / 2)
				{
					inertObj.x = stage.stageWidth - inertObj.width / 2;
					xSpeed *= -1;
				}
				if(inertObj.x < inertObj.width / 2)
				{
					inertObj.x = inertObj.width / 2;
					xSpeed *= -1;
				}
				if(inertObj.y > stage.stageHeight - inertObj.height / 2)
				{
					inertObj.y = stage.stageHeight - inertObj.height / 2;
					ySpeed *= -1;
				}
				if(inertObj.y < inertObj.height / 2)
				{
					inertObj.y = inertObj.height / 2;
					ySpeed *= -1;
				}
			}
		}
	}
}