2012-11-23 88 views
1

请帮我理解如何让自定义类实例访问时间线上定义的变量。AS3如何获取自定义类实例在时间轴上访问变量?

我没有使用文档类,因为这个程序将是一个具有多个阶段的记忆实验,所以使用时间轴对我最适合。 (FWIW,我也没有使用xml;只是尽量保持这个尽可能简单。)现在我已经做了一个简单的一帧fla,我正在试图做一个词汇测试。我创建了一个名为VocabQ的自定义类,该类又包含一个名为VocabButton的自定义类的4个实例。现在,单击其中一个按钮就可以追踪按钮标签。但我希望它也更新时间线上声明的String变量CurrentResponse的值。如果我只是尝试从VocabButton类中引用CurrentResponse,则会出现错误“1120:访问未定义的属性...”。

我尝试了各种方法,基于我在互联网上发现的讨论,但还没有成功,只是越来越困惑。请帮忙! (简单的解决方案将不胜感激,如果存在!)请参阅下面的代码。 谢谢,杰森〜

代码时间表:

import VocabQ; 
import flash.display.*; 
stop(); 

var CurrentResponse:String="NA"; 

var VocabQuestion = new VocabQ("VocabWord",["answerA","answerB","answerC","answerD"]); 
addChild(VocabQuestion); 

VocabQ.as代码:

package 
{ 
    import flash.display.*; 
    import flash.events.*; 
    import flash.net.*; 
    import flash.text.*; 
    import VocabButton; 

    public class VocabQ extends MovieClip{ 
     private var _VocabWordText:String; 
     private var _VocabWord:TextField; 
     private var _ResponseOptions:Array; 

     public function VocabQ(VocabWordText:String,ResponseOptions:Array){   
     _VocabWordText=VocabWordText; 
     _ResponseOptions=ResponseOptions; 
     build(); 
     } 

     private function build():void{   
      _VocabWord = new TextField(); 
      _VocabWord.text=_VocabWordText; 
      _VocabWord.x=25; 
      _VocabWord.y=25; 
      _VocabWord.textColor = 0x000000; 
      addChild(_VocabWord); 

      for (var i:int; i < _ResponseOptions.length; i++){ 
       var _VocabButton:VocabButton = new VocabButton(_ResponseOptions[i]); 
       _VocabButton.x = 25 + (_VocabWord.width) + 10 + ((_VocabButton.width + 2) * i); 
       _VocabButton.y = 25; 
       addChild(_VocabButton); 
       } 
      }  
    } 
} 

VocabButton.as代码:

package 
{ 
    import flash.display.*; 
    import flash.text.*; 
    import flash.events.*; 

    public class VocabButton extends MovieClip{ 
     private var _btnLabel:TextField; 

     public function VocabButton(labl:String){ 

      _btnLabel = new TextField();  
      _btnLabel.textColor = 0x000000; 
      _btnLabel.text = labl; 
      _btnLabel.border=true; 
      _btnLabel.borderColor=0x000000; 
      _btnLabel.background=true; 
      _btnLabel.backgroundColor= 0xDAF4F0; 
      _btnLabel.mouseEnabled = false; 
      _btnLabel.selectable=false; 
      _btnLabel.width=100; 
      _btnLabel.height=18;   
      buttonMode=true; 
      useHandCursor=true; 
      addEventListener(MouseEvent.CLICK,onClick,false,0,true); 

      addChild(_btnLabel); 
     } 

     private function onClick(evt:MouseEvent):void{ 
     trace(_btnLabel.text); 
     //CurrentResponse=_btnLabel.text; //causes error 1120: Access of undefined property... 
     } 
    } 
} 
+1

欢迎来到SO,Jason。一个初学者的好问题。值得一瞥http://stackoverflow.com/faq现在你在这里。 – JcFx

回答

0

这应该工作:

private function onClick(evt:MouseEvent):void { 
    trace(_btnLabel.text); 
    evt.currentTarget.root.CurrentResponse=_btnLabel.text; 
} 

见这里的讨论:http://www.actionscript.org/forums/showthread.php3?t=161188

个人,而不是试图访问这样的时间表,我宁愿一个点击监听器 添加到您的VocabQuestion在时间轴上,并允许Event to Bubble Up,或者,如果你在你的班级中将会有多个按钮,以延长EventDispatcher并创建一些自定义事件,这些事件可以在你的时间线上处理,但是对于一个简单的测试,访问root属性应该足够好。

+0

Yesss!非常感谢你。你已经救了我可能还有几个小时的失误。 –