Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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;
				}
			}
		}
	}
}

Старый 13.12.2014, 15:25
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 2  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Я не сталкивался на практике с событиями TouchEvent, но по логике, вам на движение мыши нужно подписывать не ваш объект, а сцену. Попробуйте заменить везде
Код AS3:
inertObj.addEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );
на
Код AS3:
stage.addEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );

Старый 13.12.2014, 15:29
stas0 вне форума Посмотреть профиль Отправить личное сообщение для stas0 Найти все сообщения от stas0
  № 3  
Ответить с цитированием
stas0

Регистрация: Dec 2013
Сообщений: 34
samana, вы неправильно поняли, проблема в том, что если быстро провести пальцем по экрану, то вызывается событие OUT, что в свою очередь останавливает перетаскивание объекта. Мне же нужно, чтобы этого не было.

Такая же проблема наблюдается и с MOuseEvent. Если вы замените TouchEvent на MouseEvent

Старый 13.12.2014, 16:03
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 4  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Он все правильно понял и дал вам верный совет.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 13.12.2014, 16:10
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 5  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Хорошо, возможно я не знаю каких-то нюансов у TouchEvent.
Тогда может вам поможет реализация на события обычной мыши. Здесь не зависимо с какой скоростью вы будете перемещать объект, он никогда не "выпустится", пока вы не перестанете нажимать кнопку мыши.
Попробуйте взять эту идею и переделать под TouchEvent
Код AS3:
public function Main():void 
{
	_inertObj.addEventListener(MouseEvent.MOUSE_DOWN, inertObj_mouseDown);
}
 
private function inertObj_mouseDown(e:MouseEvent):void 
{
	stage.addEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
	stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
 
}
 
private function stage_mouseUp(e:MouseEvent):void 
{
	stage.removeEventListener(MouseEvent.MOUSE_MOVE, stage_mouseMove);
	stage.removeEventListener(MouseEvent.MOUSE_UP, stage_mouseUp);
}
 
private function stage_mouseMove(e:MouseEvent):void 
{
	_inertObj.x = mouseX;
	_inertObj.y = mouseY;
}
dimarik, спасибо!

Старый 13.12.2014, 18:28
Wormhole вне форума Посмотреть профиль Отправить личное сообщение для Wormhole Найти все сообщения от Wormhole
  № 6  
Ответить с цитированием
Wormhole
 
Аватар для Wormhole

Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
Цитата:
Сообщение от dimarik Посмотреть сообщение
Он все правильно понял и дал вам верный совет.
Согласен. Автор темы, вероятно, реализовал так: если нажато на объект, то покуда палец из объекта не выйдет, двигать объект на палец. Однако (как и получилось), если слишком быстро водить пальцем, следующее обрабатывающееся прикосновение находится уже вне квадрата.

samana предложил при клике на объект подписывать stage, пока палец не будет отпущен совсем. У недовольства автора может быть только одна причина: мультитач. Когда, не убирая первого пальца, мы коснемся экрана вторым, спрайт уедет ко второму.

P. S. но до сих пор непонятно, решена ли проблема или еще нет, т. к. тс не отписывается. Автор, вам помогли советы?

Создать новую тему Ответ Часовой пояс GMT +4, время: 02:11.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 02:11.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.