2016-05-04 4 views
2

Я сделал эту игру с прослушивателем событий (координатами) на позиции мыши при щелчке (для перемещения символа).actionscript 3, removeEventListener не работает должным образом

У меня есть еще один прослушиватель событий для перетаскивания (для объединения элементов), который работает очень хорошо.

function stageDown (event:MouseEvent):void 
     {    
      stage.removeEventListener(MouseEvent.CLICK, coordinates); 
      MovieClip(getChildByName(event.target.name).toString()).startDrag(); 
      MovieClip(getChildByName(event.target.name).toString()).addEventListener(MouseEvent.MOUSE_UP,stageUp); 

      ...stuff.. 

     } 

function stageUp(event:MouseEvent):void 
    { 
     stopDrag(); 

     ...stuff... 

     stage.addEventListener(MouseEvent.CLICK, coordinates); 
    } 

В функции stageDown я удаляю слушатель событий для движения (координаты), чем я снова добавить его в конце функции stageUp (когда вы отпустите кнопку мыши и перетащить полный)

но не работает, когда я выпускаю перетащить персонажа начать движение, не может понять, почему

+0

вашего 'stageDown' обработчик крепился к столику (как имя может предложить)? или предмет (ы), который вы перетаскиваете? – BadFeelingAboutThis

+0

'MovieClip (getChildByName (event.target.name) .toString()). StartDrag();' о, дорогая! – null

+1

О, дорогая, угадайте, что простой «event.target.startDrag()» не достаточно модный .... – BotMaster

ответ

1

Я не в полной мере понять, почему (что-то делать с тем, как события Click отслеживаются я полагаю), но это «нормальное» поведение.

Вот как я справлялся с этим в прошлом. В принципе вы можете добавить более высокий приоритет щелчок слушателя к объекту вы тащите и отменить событие есть: (см комментариев кода)

//Assuming you have something like this in your code///////// 
stage.addEventListener(MouseEvent.CLICK, coordinates); 

function coordinates(event:MouseEvent):void { 
    trace("STAGE CLICK"); //whatever you do here 
} /////////////////////////////////////////////////////////// 

//add your mouse down listener to your object 
someObject.addEventListener(MouseEvent.MOUSE_DOWN, stageDown); 

//ALSO add a click listener to your object, and add it with higher priority than your stage mouse click listener 
someObject.addEventListener(MouseEvent.CLICK, itemClick, false, 999); 

function itemClick(event:MouseEvent):void { 
    //stop the event from reaching the lower priority stage mouse click handler 
    event.stopImmediatePropagation(); 
    trace("Item CLICK"); 
} 

function stageDown (event:MouseEvent):void 
{    
    Sprite(event.currentTarget).startDrag(); 
    //listen for the mouse up on the stage as sometimes when dragging very fast there is slight delay and the object may not be under the mouse 
    stage.addEventListener(MouseEvent.MOUSE_UP,stageUp, true); 

    //if you don't care about mouse up on stage, then you can just forget the mouse up listener and handler altogether and just stop drag on the itemClick function. 
} 

function stageUp(event:MouseEvent):void 
{ 
    //remove the stage mouse up listener 
    stage.removeEventListener(MouseEvent.MOUSE_UP,stageUp, true); 
    trace("UP"); 
    stopDrag(); 
} 
+0

, это сработало, как шарм, большое спасибо! – Stevemaster

Смежные вопросы