2014-03-30 63 views
-1

我遇到If和If Else语句的问题。AS3如果/如果其他问题

我想创建一个菜单,它将在各种预先确定的X坐标处生成一个动画片段。

问题是,当测试按钮A,B,C,D时,如果我点击“A”按钮,它会跟踪“load1”这是一个“测试”uint为“0”和B应该跟踪“测试”为1,C为2和D为3.

事情是,我点击每个按钮将有一个输出为“0”,这是第一个“if”语句。

帮助将不胜感激!

这是import语句(有没有办法来优化这个代码?正如我仍然有按钮,直到“Y”)

Layout_KeyboardOne.btn_A.addEventListener(MouseEvent.CLICK,ButtonHandler); 
Layout_KeyboardOne.btn_B.addEventListener(MouseEvent.CLICK,ButtonHandler); 
Layout_KeyboardOne.btn_C.addEventListener(MouseEvent.CLICK,ButtonHandler); 
Layout_KeyboardOne.btn_D.addEventListener(MouseEvent.CLICK,ButtonHandler); 

这是ButtonHandler功能

if (Layout_KeyboardOne.btn_A) 
     { 
      load1 = 0; 
      trace(load1); 
     } 
    else if(Layout_KeyboardOne.btn_B) 
     { 
      load1 = 1; 
      trace(load1); 
     } 
    else if(Layout_KeyboardOne.btn_C) 
     { 
      load1 = 2; 
      trace(load1); 
     } 
    else if(Layout_KeyboardOne.btn_D) 
     { 
      load1 = 3; 
      trace(load1); 
     } 

回答

0

尝试使用switch语句,因为如果有更多的情况,它会更干净更快。

function ButtonHandler(e:MouseEvent):void { 
    switch(e.currentTarget) { 
     case Layout_KeyboardOne.btn_A: 
      load1 = 0; 
      trace(load1); 
      break; 
     case Layout_KeyboardOne.btn_B: 
      load1 = 1; 
      trace(load1); 
      break; 
     //... 
    } 
} 
3

您的事件处理程序中的条件语句不检查哪个按钮触发了该事件。相反,他们测试剪辑是否被定义。就你的情况而言,无论点击哪个按钮,第一条语句将评估为true,因为Layout_KeyboardOne.btn_A已定义。的区别

的一种方式,其实例所触发的特定事件是使用Event对象的currentTarget财产(见documentation):

function ButtonHandler(event:Event):void { 
    if (event.currentTarget == Layout_KeyboardOne.btn_A) { 
     // btn_a was clicked 
    } 
} 
+0

包含比我的答案更多的解释,但我仍然更喜欢切换if-else,当涉及到超过2-3个案例。 :) – Zhafur

+1

同意。虽然真正的问题是OP的条件不检查OP认为他们在检查什么。 –

0

开关的情况下会吃你的处理器,一个长长的清单,你为什么不使用对象的数组

function btnList():array{ 
     var _btnA:Object={label:"Layout_KeyboardOne.btn_A",load : 0}; 
     var _btnB:Object={label:"Layout_KeyboardOne.btn_B",load : 1}; 
     .... 
     .... 
     var arr:Array = new Array(btnA , btnB ,btnc.....); 
     return arr; 
     } 

     combobox.addEventListener(Event.CHANGE,mainGoal); 
     combobox.labelField = "label"; 

现在你可以使用该列表中comboxbox或任何地方调用您想通过循环显示。

for each (var btns:Object in btnList()){ 
    dropDown.addItem(btns); 
} 

现在你可以进行函数调用你的欲望的目标

function mainGoal():void{ 
    var myObject:object = dropdown.selectedItem; 
    trace("object label : "+ myObject.label); 
    trace("object load : "+ myObject.load); 
    } 

因此这可能例如离线功能,它会使用更少的处理器比较,如果别人和开关的情况下。