![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Dec 2013
Сообщений: 34
|
Проблема заключается в том, что при очень быстром движении "пальца" возбуждается событие OUT. Мне нужно этого избежать. Как это исправить?
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; } } } } } |
|
|||||
|
Я не сталкивался на практике с событиями TouchEvent, но по логике, вам на движение мыши нужно подписывать не ваш объект, а сцену. Попробуйте заменить везде
на |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 34
|
samana, вы неправильно поняли, проблема в том, что если быстро провести пальцем по экрану, то вызывается событие OUT, что в свою очередь останавливает перетаскивание объекта. Мне же нужно, чтобы этого не было.
Такая же проблема наблюдается и с MOuseEvent. Если вы замените TouchEvent на MouseEvent |
|
|||||
|
Регистрация: Jun 2014
Адрес: Санкт-Петербург
Сообщений: 185
|
Согласен. Автор темы, вероятно, реализовал так: если нажато на объект, то покуда палец из объекта не выйдет, двигать объект на палец. Однако (как и получилось), если слишком быстро водить пальцем, следующее обрабатывающееся прикосновение находится уже вне квадрата.
samana предложил при клике на объект подписывать stage, пока палец не будет отпущен совсем. У недовольства автора может быть только одна причина: мультитач. Когда, не убирая первого пальца, мы коснемся экрана вторым, спрайт уедет ко второму. P. S. но до сих пор непонятно, решена ли проблема или еще нет, т. к. тс не отписывается. Автор, вам помогли советы? |
|
|||||
|
Хорошо, возможно я не знаю каких-то нюансов у TouchEvent.
Тогда может вам поможет реализация на события обычной мыши. Здесь не зависимо с какой скоростью вы будете перемещать объект, он никогда не "выпустится", пока вы не перестанете нажимать кнопку мыши. Попробуйте взять эту идею и переделать под TouchEvent 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; } |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|