2016-06-30 2 views
2

Я пытаюсь закодировать простой класс уведомлений в as3, это как две кнопки, одна для «ok», одна для «отмены», поэтому есть один прослушиватель событий для каждая кнопка.Измените переменную, когда событие запускается в AS3

Проблема в том, что я хочу, чтобы переменная передавалась из основного класса в класс уведомления, а затем возвращалась в основное меню после того, как пользователь запускал один из eventListener.

Я пробовал разные вещи, но никто не работает, я уверен, что есть простой и простой способ сделать это, но я новичок в языке.

Спасибо, и извините за мой английский.

Вот пример:

Main.as:

package { 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite { 

    [SWF(width="640",height="480",backgroundColor="#ffffff")] 

     public function Main():void { 
      if (stage) 
      init(); 
      else 
      addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void { 

      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var msg:Notification = new Notification(); 
      addChild(msg); 

     } 
    } 
} 

Notification.as:

package { 
    import flash.display.Sprite; 
    import flash.events.MouseEvent; 
    import flash.text.TextField; 
    import flash.text.TextFormatAlign; 
    import flash.text.TextFieldAutoSize; 

    public class Notification extends Sprite { 

     private var background:Sprite; 
     private var button1:Sprite; 
     private var button2:Sprite; 
     private var buttonOk:TextField; 
     private var buttonCancel:TextField; 

     public function Notification() {  
      addBackground(); 
      addMessage(); 
      addOkButton(); 
      addCancelButton(); 
     } 

     private function addBackground():void { 
      background = new Sprite(); 
      background.graphics.beginFill(0x4682b4, 1); 
      background.graphics.drawRoundRect(0, 0, 300, 200, 30, 30); 
      background.graphics.endFill(); 
      addChild(background); 
     } 

     private function addMessage():void { 
      message = new TextField(); 
      message.autoSize = TextFieldAutoSize.LEFT; 
      message.text = "My text"; 
      message.scaleX = 1.2; 
      message.scaleY = 1.2; 
      message.textColor = 0xffffff; 
      background.addChild(message); 
     } 

     private function addOkButton():void { 
      button2 = new Sprite(); 
      button2.graphics.beginFill(0x35733b, 1); 
      button2.graphics.drawRoundRect(0, 0, 90, 40, 10, 10); 
      button2.x = 175; 
      button2.y = 115; 
      button2.buttonMode = true; 
      button2.mouseChildren = false; 
      button2.alpha = 0.7; 
      background.addChild(button2); 

      button2.addEventListener(MouseEvent.ROLL_OVER, onButton2); 
      button2.addEventListener(MouseEvent.ROLL_OUT, outButton2); 
      button2.addEventListener(MouseEvent.CLICK, clickButton2); 

      buttonOk = new TextField(); 
      buttonOk.autoSize = TextFieldAutoSize.LEFT; 
      buttonOk.text = "Ok"; 
      buttonOk.scaleX = 1.2; 
      buttonOk.scaleY = 1.2; 
      buttonOk.textColor = 0x000000; 
      buttonOk.selectable = false; 
      buttonOk.x = button2.width/2 - buttonOk.width/2; 
      buttonOk.y = button2.height/2 - buttonOk.height/2; 
      button2.addChild(buttonOk); 
     } 


     private function addCancelButton():void { 
      button1 = new Sprite(); 
      button1.graphics.beginFill(0x771d1d, 1); 
      button1.graphics.drawRoundRect(0, 0, 90, 40, 10, 10); 
      button1.x = 25; 
      button1.y = 115; 
      button1.buttonMode = true; 
      button1.useHandCursor = true; 
      button1.mouseChildren = false; 
      button1.alpha = 0.7; 
      background.addChild(button1); 

      button1.addEventListener(MouseEvent.ROLL_OVER, onButton1); 
      button1.addEventListener(MouseEvent.ROLL_OUT, outButton1); 
      button1.addEventListener(MouseEvent.CLICK, clickButton1); 

      buttonCancel = new TextField(); 
      buttonCancel.autoSize = TextFieldAutoSize.LEFT; 
      buttonCancel.text = "Cancel"; 
      buttonCancel.scaleX = 1.2; 
      buttonCancel.scaleY = 1.2; 
      buttonCancel.textColor = 0x000000; 
      buttonCancel.x = button1.width/2 - buttonCancel.width/2; 
      buttonCancel.y = button1.height/2 - buttonCancel.height/2; 
      button1.addChild(buttonCancel); 
     } 


     private function onButton1(e:MouseEvent):void { 
      button1.alpha = 1; 
     } 
     private function outButton1(e:MouseEvent):void { 
      button1.alpha = 0.7; 
     } 

     private function onButton2(e:MouseEvent):void { 
      button2.alpha = 1; 
     } 
     private function outButton2(e:MouseEvent):void { 
      button2.alpha = 0.7; 
     } 

     private function clickButton1(e:MouseEvent):void { 
      this.parent.removeChild(this); 
     } 
     private function clickButton2(e:MouseEvent):void { 
      this.parent.removeChild(this); 
     } 
    } 
} 
+0

Зачем вам возвращать такое же значение? В чем смысл отправлять уведомление? – null

+0

Поскольку после того, как значение будет возвращено в Main, я хочу, чтобы оно было обнаружено (если нажать кнопку). Это плохо ? – Bogdan

ответ

2

Там нет смысла посылать любую переменную в уведомлении, и вернуть его обратно. В уведомлении должно указываться только то, что было нажато на его кнопки.

Подумайте об этом: что, если вам нужно другое уведомление для другого значения, это также просто кнопка «ok» и «cancel». Вы создадите для этого еще один класс уведомлений?

Уведомление не должно знать каких-либо знаний или класса Main. Это должно сделать его максимально независимым. Сохраните переменную в обратном направлении через уведомление и вернитесь к основному.

Вместо этого, сделать что-то подобное в Main:

  1. создать уведомление
  2. прослушивания события уведомления
  3. событие уведомления будет содержать то, что произошло (ОК или отменить)
  4. на основе того, что произошло, выполнить некоторую логику в Главном

Другие вспомогательные действия что вы, вероятно, хотите выполнить, например:

  • делает уведомление видимым/невидимым
  • убедившись, что его модальным (больше ничего не может быть нажата, когда он активен)

Такие действия из для этого вопроса, поскольку речь идет только о потоке информации.


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

package 
{ 
    public class NotificationEvent extends Event 
    { 
     private var _action:String; 

     public function get action() 
     { 
      return _action; 
     } 

     public NotificationEvent (action:String = "ok") 
     { 
      _action = action; 
     } 
    } 
} 

В классе уведомлений о доставке этого события и передать String в конструктор, который описывает действие. (Вы можете сделать это гораздо более сложные только позволяя определенные ценности, которые были бы очень удобно, но это не добавляет к общей функциональности)

dispatchEvent(new NotificationEvent("cancel")); // when cancel button is clicked 

в Main, слушатель добавил к уведомлению получит Событие в качестве параметра и может извлечь выполняется действие через свойство action я определен в классе, например, в распределительном случае:

function notificationHandler(e:NotificationEvent) 
{ 
    switch(e.action) 
    { 
     case "ok": 
     //do stuff 
     break; 

     case "cancel": 
     //do other stuff 
     break; 
    } 
} 

в первый обычай событие кажется как overcomplication, но он обеспечивает четкий интерфейс уведомление, не раскрывая никаких внутренних вещей. Если вы хотите добавить управление клавиатурой, например «enter» для «ok» и «esc» для «cancel», вы можете сделать это в классе Notification, не меняя ничего снаружи. Просто не забудьте отправить NotificationEvent.

Вы часто находите код, который пытается совершить трюки, такие как notification.okBtn.addEventListener..., из класса Main, который работает сначала, но быстро взрывается, если вы применяете изменения.

+0

Спасибо, вот что я искал. – Bogdan

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