2015-05-04 6 views
0

У меня есть событие под названием SelectEvent. Всякий раз, когда я нажимаю на покупателя, следует запускать событие select. Но это не то, что происходит.Пользовательские события, не работающие в AS3

Мой код базы:

package 
{ 

    import flash.display.MovieClip; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.events.MouseEvent; 

    public class FashionFrenzy extends MovieClip 
    { 

     public var Buyer_mc:Buyer; 
     public var Buyers:Array; 
     private var BuyerNumber:Number; 
     public var xpositions:Array; 
     public var ypositions:Array; 
     public var SelectedBuyer:Number; 

     public function FashionFrenzy() 
     { 

      GameTimeController(); 

      xpositions=new Array(); 
      xpositions.push(523,563,603); 

      ypositions=new Array(); 
      ypositions.push(377,377,377); 

      Buyers = new Array ; 
      BuyerNumber=0; 


      Time_mc.gameTimer.addEventListener(TimerEvent.TIMER,GenerateBuyers); 
      addEventListener(SelectEvent.BUYERSELECT,showselectbuyer); 


     } 


     public function GameTimeController() 
     { 
      Time_mc.StartGame(); 

     } 
     public function showselectbuyer(event:SelectEvent):void 
     { 
      trace("Bamba");   
     } 
     public function GenerateBuyers(event:TimerEvent):void 
     { 
      if(BuyerNumber<6) 
      { 
       if (Math.random() < 0.01) 
       { 
        var position:Number = Math.floor(Math.random()*3); 
        var newBuyer_mc = new Buyer(xpositions[position],ypositions[position],BuyerNumber); 
        ypositions[position]-=40; 
        Buyers.push(newBuyer_mc); 
        addChild(newBuyer_mc); 

        BuyerNumber++; 

       } 
      } 

       for each (var buyer_mc:Buyer in Buyers) 
       { 
        if(buyer_mc.walking==true) 
        { 

         buyer_mc.Enter(); 


        } 


       } 


     } 








    } 

} 

Мой код покупателя:

package 
{ 

    import flash.display.MovieClip; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.events.MouseEvent; 

    public class Buyer extends MovieClip 
    { 
     public var buyerTimer:Timer; 
     public var walking:Boolean; 
     public var stopposition:Number; 
     public var buyerCode:Number; 



     public function Buyer(startx:Number, stopy:Number, code:Number) 
     { 
      x=startx; 
      stopposition=stopy; 
      walking=true; 
      buyerCode=code; 

      BuyerProperties(); 

     } 
     public function Enter():void 
     { 

      if(y>stopposition) 
      { 

       walking=false; 
       StartFunction(); 

      } 
      else 
      { 
       y= y+3; 
      } 
     } 
     public function BuyerProperties():void 
     { 
      buyerTimer = new Timer(25); 
      trace(" I am generated"); 

     } 
     public function StartFunction():void 
     { 

      buyerTimer.start(); 
      addEventListener(MouseEvent.CLICK,Select); 

      trace("My timer starts now within Buyer.as"); 
     } 
     public function Select(event:MouseEvent):void 
     { 
      trace(buyerCode); 
      dispatchEvent(new SelectEvent(SelectEvent.BUYERSELECT)); 
     } 




    } 

} 

Теперь, когда я нажав на покупателя, то MouseEvent.CLICK активируется, а затем в покупателя ., на экране прослеживается buyercode. Но событие не отправляется, иначе оно отправляется, но eventlistener не выполняет код. Я не получаю ошибок во время выполнения. функция «showselectbuyer» никогда не запускается.

Как его решить?

+0

При просмотре кода заметили, что 'Buyers = new Array;' должно быть 'Buyers = new Array();'. –

+0

Хорошо, я это исправляю. Спасибо. Но исправление, которое не делает различий в проблеме, с которой я сталкиваюсь. – Mana

+0

Вы пузыряете свои события для класса 'SelectEvent'? –

ответ

1

Принимаемый ответ неверен. Предоставленное решение работает, но по неправильным причинам. Он создает прямую зависимость от объекта, который должен прослушивать настраиваемое событие, а затем делает этот объект диспетчером. Все это делает всю идею использования события/пользовательского события ненужным в лучшем случае, поскольку в этом случае простой обратный вызов будет работать так же хорошо. Вместо того, чтобы использовать флаг useCapture бы всю работу системы, как и ожидалось:

addEventListener(SelectEvent.BUYERSELECT,showselectbuyer, true); 

Принятое решение также обратный способ борьбы с распространением, не DisplayObject событий. Диспетчер должен быть слушателем (без зависимостей), а не слушателем должен быть диспетчер (требуется зависимость).

+0

«Этот параметр меняет фазу прослушивания. Он не создает пузырь событий», где в моем ответе говорится, что он создает пузырь событий? Bubbling или нет, если вы не используетеCapture для истины, вы не поймаете пузырьковую фазу события. – BotMaster

+0

Благодарим вас за разъяснение. Это по-прежнему кажется неточным и запутанным. Знать, как захватить в фазе барботажа, не полезно, не зная, как сделать пузырь событий в первую очередь, потому что это свойство самого объекта Event. И нет, setCapture не требуется для прослушивания пузырькового события. – null

+0

, если вы запустите код PO, просто установив useCapture в true, событие будет поймано, что, я думаю, будет гораздо лучшим ответом на вопрос PO, чем тот, который был принят. Это была цель ответа, который я опубликовал. Принятый ответ неправильно создает прямую зависимость, которая полностью нарушает цель использования настраиваемого события, но все еще использует пользовательские события. Я считаю, что нужно что-то сказать. – BotMaster

-1

Проблема с настраиваемыми событиями заключается в том, что они не пузыряют список отображения, поэтому в случае, если ваше событие должно быть зарегистрировано, вам нужно отправить его в экземпляр класса, в котором есть слушатель, к этому подключенному событию. В вашем случае это пример FashionFrenzy. По-видимому, покупатели не знают о экземпляре моды, в котором они работают, поэтому они отправляют это событие себе и удивляются, почему никто не слушает. Чтобы разрешить это, либо присоедините слушателя к покупателю, либо в классе покупателя отправьте событие на parent, что, по-видимому, является экземпляром, который вы хотите получить.

+0

Большое вам спасибо. добавление «родителя» отлично работало. – Mana

+1

@ Мана, добавляющая слушателя к объекту покупателя, является лучшим вариантом. С вашей текущей настройкой только родитель покупателя может прослушивать Событие. Это в первую очередь побеждает в использовании событий, что создает свободную связь между двумя объектами. Это тот случай, если какой-либо объект может добавить слушателя к покупателю. Но так, как вы это делаете сейчас, ваша структура очень строгая. ** Только ** родитель отправит события. – null

+1

Правильное решение - просто установить useCapture в true. Использование «родительского элемента», даже если оно обеспечивает решение проблемы ПО, полностью преследует цель использования события в первую очередь и неправильно помечено как правильный ответ. – BotMaster