2016-01-06 4 views
-1

У меня есть много перетаскивания объектов на сцене, и код по умолчанию фрагмента аддов нового слушателя событий и функции на сцену для каждого объекта:выполнения одной функции против нескольких

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop); 
function fl_ReleaseToDrop(event:MouseEvent):void { instance_1.stopDrag(); } 
stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop_1); 
function fl_ReleaseToDrop_1(event:MouseEvent):void { instance_2.stopDrag(); } 
.... 

было бы лучше или хуже, чтобы помещать их всех в одного слушателя?

stage.addEventListener(MouseEvent.MOUSE_UP, fl_ReleaseToDrop); 
function fl_ReleaseToDrop(event:MouseEvent):void { 
    instance_1.stopDrag(); 
    instance_2.stopDrag(); 
    .... 
} 
+0

Где ваш 'startDrag' происходит? – Aaron

+1

Если вы беспокоитесь о производительности, вы должны начать с поиска способа не запускать все эти stopDrag() для всех ваших экземпляров. Разумеется, они не могут быть перетащены одновременно, поэтому правильная вещь, которую нужно сделать в первую очередь, заключается в том, чтобы остановить только перетаскиваемый экземпляр. – BotMaster

+0

Запуск перетаскивания в основной сцене, один кадр, рабочий слой. Просто изучая AS3 после того, как вы не практиковались в течение нескольких лет. И я хочу иметь возможность перетаскивать каждый элемент по отдельности. С AS2 я мог бы поместить код в объект, поэтому start/stop был специфичен для объекта. Больше не с AS3, следовательно, вопрос. – Naidim

ответ

1

Один вызов функции, безусловно, быстрее, чем несколько вызовов функций. Однако разница здесь будет незначительной.

С точки зрения удобочитаемости кода, я бы сказал, что один вызов функции, который вы показали, лучше.


Вообще, как мне нравится делать перетащить и падение, чтобы добавить обработчик mouseUp когда я начинаю перетаскивать и удалить его сразу после завершения перетаскивания. Например:

instance1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 
instance2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 
instance3.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 

function mouseDown(e:MouseEvent):void { 
    Sprite(e.currentTarget).startDrag(); 
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp); 
} 

function mouseUp(e:MouseEvent):void { 
    stopDrag(); 
    stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUp); 
} 
+0

Спасибо! Sprite (e. currentTarget) был именно тем, что я искал, чтобы создать функцию многократного использования. – Naidim

+0

это не лучшее решение, и «stopDrag();» один в mouseUp не собирается делать многого. – BotMaster

+1

@BotMaster Ну, это не будет гораздо больше, кроме того, чтобы остановить перетаскивание.;) Вам не нужно вызывать 'stopDrag' на том же спрайте, который вы назвали' startDrag'. – Aaron

1

Для вспышки временной шкалы простого и эффективного решения вы просто сохранить ссылку на ваш объект и что это о нем:

stage.addEventListener(MouseEvent.MOUSE_UP, mouseUp); 
instance1.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 
instance2.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 
instance3.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 
var draggedObject:Sprite; 

function mouseDown(e:MouseEvent):void 
{ 
    draggedObject = e.currentTarget as Sprite; 
    if(draggedObject) 
    { 
     draggedObject.startDrag(); 
    }   
} 

function mouseUp(e:MouseEvent):void 
{ 
    if(draggedObject) 
    { 
     draggedObject.stopDrag(); 
     draggedObject = null; 
    } 
} 
+1

Это не скомпилируется: 'startDrag' определен в' Sprite', а не 'DisplayObject'. – Aaron

+0

вот что происходит, когда я пишу код из головы. изм. – BotMaster

+0

Отличный старт. Но что, если вам нужно передать переменные mouseUp, чтобы точно привязать объекты к позиции? например if (sprite.x> 100 и спрайт x <200) sprite.x = 150. И эти значения разные для КАЖДОГО спрайта.Все примеры «Pass Parameter», которые я видел, предопределили вызов функции как переменную, но как вы это сделаете для разных спрайтов? Один для каждого? Это будет гораздо больше кода, чем один mouseUp(), который выполняется на каждом спрайте. – Naidim