Pull to refresh

Еще один способ управлять event listener-ами

Reading time2 min
Views1.5K
События редко происходят по одному как обычно пишут в примерах. В жизни мы имеем дело с последовательностями событий (например соединение, авторизация, звонок) и на каждом этапе могут произойти еще другие события (отмена звонка, разрыв соединения).

Попробуй мы словами проговорить, что должно происходить, можно услышать много «если мы получили событие то…, иначе если кликнули сюда то, а если таймаут то». Здесь я описываю свою попытку программировать события в стиле if-else.


// группа event listener-ов
beginGroup();

// аналог btn_shoot_mc.addEventListener("click",function ...);
// listener удаляется в зависимости от того, что возвращает handler
// "none" - ничего не удаляется
// "self"  - удаляет этот listener
// "group" - удаляет все listener-ы в группе

wait(btn_shoot_mc,"click",function(e:Object){
  //Огонь
  return "group";
});
timeout(2.0,function(e:Object){
  //поздно, тебя убили
  return "group";
});
timer(0.5,function(e:Object){
  // показать обратный отсчет
  return "none";
});
endGroup();


Возможности языка ActionScript не позволяют использовать привычный синтаксис if-else, но вызовы wait, timeout, timer внутри beginGroup и endGroup по сути выполняют эту роль.

Еще один пример: контекстное меню

import com.github.iovdin.eventtree.*;

// items - массив MovieClip-ов над которым может появиться контекстное меню 
wait(items,"click",function(e:Object){
  var item:Sprite = e.currentTarget;

  //эта функция 
  var h:Function = arguments.callee;

  addChild(menu);
  menu.x = item.x;
  menu.y = item.y;

  // в следующем фрейме  
  nextFrame(function(e:Object){
    // внутри функций библиотеки подразумеваются beginGroup, endGroup

    // кликнули на меню или пункт меню
    wait(menu,"click",function(e:Object){
      // сделать что-то полезное
      menu.parent.removeChild(menu);
      
      //начинаем с начала
      wait(items,"click",h);
      return "group";						
    });
  
    //если кликнули на stage или на этот MovieClip спрятать меню
    wait([stage,item],"click",function(e:Object){
      menu.parent.removeChild(menu);
      
      //начинаем сначала
      wait(items,"click",h);
      return "group";
    });

    //если другой item кликнули, показать над ним меню
    wait(items,"click",function(e:Object){
      if(e.currentTarget == item) return "none";
      h(e);
      return "group";
    });
  });
  return "self";
});

Tags:
Hubs:
Total votes 9: ↑3 and ↓6-3
Comments0

Articles