Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Drag/drop (http://www.flasher.ru/forum/showthread.php?t=209728)

stas0 13.12.2014 15:11

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;
                                }
                        }
                }
        }
}


samana 13.12.2014 15:25

Я не сталкивался на практике с событиями TouchEvent, но по логике, вам на движение мыши нужно подписывать не ваш объект, а сцену. Попробуйте заменить везде
Код AS3:

inertObj.addEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );

на
Код AS3:

stage.addEventListener( TouchEvent.TOUCH_MOVE, _moveDrag );


stas0 13.12.2014 15:29

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

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

dimarik 13.12.2014 16:03

Он все правильно понял и дал вам верный совет.

samana 13.12.2014 16:10

Хорошо, возможно я не знаю каких-то нюансов у 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, спасибо!

Wormhole 13.12.2014 18:28

Цитата:

Сообщение от dimarik (Сообщение 1176272)
Он все правильно понял и дал вам верный совет.

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

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

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


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

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