Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как разделить события перетаскивания и клика по одному мувику? (http://www.flasher.ru/forum/showthread.php?t=167283)

In8Finity 09.09.2011 12:16

Как разделить события перетаскивания и клика по одному мувику?
 
Как разделить события перетаскивания и клика по одному мувику?

У меня есть объект который можно и таскать и кликать на него.
Проблема в том, что при перетаскивании срабатывает и событие клика, что мне не нужно.
Я пытался ввести переменную, которая бы клик отрубала, но этоне помогло.
Подскажите, как побороть?
Код у меня такой:

Код AS3:

        hero.addEventListener(MouseEvent.CLICK, heroClick);                                
        hero.addEventListener(MouseEvent.MOUSE_DOWN, heroStartDrag);                       
        hero.addEventListener(MouseEvent.MOUSE_UP, heroStopDrag);               
        .....
 
        function heroClick(evt:MouseEvent):void { if (!flagclick){trace("Click!")}}
 
        function heroStartDrag(evt:MouseEvent):void {
        trace("Start Drag");
        evt.currentTarget.startDrag();
        flagclick = true;}
 
        function heroStopDrag(evt:MouseEvent):void {
        trace("Stop Drag");
        evt.currentTarget.stopDrag();
        flagclick = false;}


Gogan 09.09.2011 12:23

Код AS3:

hero.addEventListener(MouseEvent.MOUSE_MOVE, heroStartDrag);
hero.addEventListener(MouseEvent.MOUSE_UP, heroStopDrag);
 
private function handleMouseMove(event:MouseEvent):void
{
        if (event.buttonDown)
        {
              //do drag
            hero.removeEventListener(MouseEvent.CLICK, heroClick);
        }
}
 
function heroStopDrag(evt:MouseEvent):void {
        trace("Stop Drag");
        evt.currentTarget.stopDrag();
        flagclick = false;
        hero.addEventListener(MouseEvent.CLICK, heroClick);
}


In8Finity 09.09.2011 12:48

Не очень понял. Вероятно вместо функции handleMouseMove вы имели ввиду heroStartDrag?
Я попробовал так. Не заработало.

Код AS3:

hero.addEventListener(MouseEvent.CLICK, heroClick);                                
hero.addEventListener(MouseEvent.MOUSE_MOVE, heroStartDrag);                       
hero.addEventListener(MouseEvent.MOUSE_UP, heroStopDrag);               
...
        function heroClick(evt:MouseEvent):void {trace("Click!")}
 
        function heroStartDrag(evt:MouseEvent):void { 
        if (evt.buttonDown){
            trace("Start Drag");
            evt.currentTarget.startDrag();
            flagclick = true;}}
 
        function heroStopDrag(evt:MouseEvent):void {
            trace("Stop Drag");
            evt.currentTarget.stopDrag();
            flagclick = false;}


Gogan 09.09.2011 13:06

да , не работает отписка... сейчас

mooncar 09.09.2011 13:14

В AS2 как-то решал такую задачу. После нажатия вычислялось - было смещение после нажатия (onPress) или нет. Если не было - на onRelease выполнялись действия, задуманные по клику. Если же смещение после onPress было - то ничего дополнительно не предпринималось.
Возможно данный алгоритм можно и в AS3 через MOUSE_DOWN, MOUSE_UP и проверку смещения попробовать?

Gogan 09.09.2011 13:18

Решение в лоб :D :
Код AS3:

 
hero.addEventListener(MouseEvent.MOUSE_MOVE, heroStartDrag);                       
hero.addEventListener(MouseEvent.MOUSE_UP, heroStopDrag);               
hero.addEventListener(MouseEvent.CLICK, heroClick);
 
var isHeroMoved:Boolean;
var isDragged:Boolean;
 
        function heroClick(evt:MouseEvent):void {
                if(isHeroMoved)
                {
                        isHeroMoved = false;                       
                }
                else
                {
                        trace("Click!")
                }
 
 
                }
 
        function heroStartDrag(evt:MouseEvent):void { 
        if (evt.buttonDown){
hero.removeEventListener(MouseEvent.CLICK, heroClick);
 
            evt.currentTarget.startDrag();
                        isDragged = true;
            }
 
                        }
 
        function heroStopDrag(evt:MouseEvent):void {
            trace("Stop Drag");
            evt.currentTarget.stopDrag();                       
            if(isDragged)
                        {
                                isHeroMoved = true;
                                isDragged = false;
                        }
 
 
            }

Может и не очень красиво с двумя флажками, зато работает :)

In8Finity 09.09.2011 13:27

Вложений: 1
Не совсем. Сообщение "Click" не выдаётся.

alex3dsflash 09.09.2011 14:31

А я делал задержку по времени

Gogan 09.09.2011 14:34

Цитата:

Сообщение от In8Finity (Сообщение 1029734)
Не совсем. Сообщение "Click" не выдаётся.

Да, снова поспешил я, наверное не оттуда скопировал...
Удалить нужно эту вот строку:

Код AS3:

hero.removeEventListener(MouseEvent.CLICK, heroClick);


In8Finity 09.09.2011 14:37

Ура! Вот теперь заработало.
Спасибищще!


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

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