Please help me understand how to get custom class instances to access variables defined on the timeline.
I am not using a document class, because this program will be a memory experiment with multiple stages, so using the timeline works best for me. (FWIW, I’m also not using xml; just trying to keep this as simple as possible.) For now I’ve just made a simple one-frame fla on which I’m trying to make a vocabulary test. I have made a custom class called VocabQ, which in turn contains 4 instances of a custom class called VocabButton. Right now, clicking one of those buttons just traces the button label. But I want it to also update the value of the String variable CurrentResponse, which is declared on the timeline. If I just try to reference CurrentResponse from the VocabButton class, I get an error “1120: Access of undefined property…”.
I’ve tried a variety of approaches based on discussions I’ve found across the internet, but have not yet had success and am only getting more confused. Please help! (Simple solutions would be greatly appreciated, if such exist!) See code below.
thank you, ~jason
code in timeline:
import VocabQ;
import flash.display.*;
stop();
var CurrentResponse:String="NA";
var VocabQuestion = new VocabQ("VocabWord",["answerA","answerB","answerC","answerD"]);
addChild(VocabQuestion);
VocabQ.as code:
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 code:
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...
}
}
}
This should work:
See the discussion here: http://www.actionscript.org/forums/showthread.php3?t=161188
Personally, rather than trying to access the timeline like this, I would prefer to add a click listener
to your
VocabQuestionon the timeline and allow the Event to Bubble Up, or, if you are going to have a number of buttons within your class, to extend EventDispatcher and create some custom events which can likewise be handled on your timeline, but for a simple test, accessing therootproperty should be good enough.