以下是我正在处理的代码示例:
package button
{
import flash.display.*;
import flash.events.*;
public class Button extends MovieClip
{
public var mybutton:MovieClip;
public function Button () {
buttonMode=true;
mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
}
public function handle (e:MouseEvent) {
trace ("hello")
}
}
}
Click here to download an example
它给了我以下错误,我无法弄清楚原因:
TypeError: Error #1010: A term is undefined and has no properties.
at button::Button()
at test()
at flash.display::Sprite/constructChildren()
at flash.display::Sprite()
at flash.display::MovieClip()
请注意,我的脚本设置中启用了自动声明。我该如何解决这个问题?
答案 0 :(得分:1)
首先,您将mybutton定义为MovieClip,但从未使用“new”关键字实际创建它,也不会将该引用分配给任何现有对象,因此默认情况下该引用为“null”。但即使您确实如此正确地创建了一个新的MovieClip:
public var mybutton:MovieClip;
public function Button () {
mybutton = new MovieClip();
if(stage){
stage.addChild(mybutton);
}
buttonMode=true;
mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
}
然后你会遇到同样的问题,而有问题的代码行将是:
mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle );
MovieClip类是一个动态类,这意味着您可以在运行时动态定义该对象的属性,但在此之前,该引用为null或未定义。以您的代码为例:
mybutton.fromFile
属性“fromFile”必须是您已经在myButton中创建的MovieClip的符号名称,或者必须先在代码中的某个位置定义它,然后才能访问它。使用以下代码时,您将访问此未定义的引用:
mybutton.fromFile.addEventListener
你告诉flash“好吧,myButton附带了一个现有的对象叫做fromFile,所以去吧,并附上一个监听器。”由于您从未实际创建过对象并附加到动态的用户自制属性“fromFile”,因此该“术语”未定义。以下是此代码的唯一方法:
package button
{
import flash.display.*;
import flash.events.*;
public class Button extends MovieClip
{
public var mybutton:MovieClip;
public function Button () {
buttonMode=true;
mybutton.fromFile = new MovieClip();
//OR
//mybutton.fromFile = someOtherMovieClip;
mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
}
public function handle (e:MouseEvent) {
trace ("hello")
}
}
}
另请注意,为了将侦听器附加到任何对象,该Object必须在对象继承链的某个级别实现IEventDispatcher,或者在某个级别,该对象必须从EventDispatcher派生或扩展。 MovieClips,Sprite和其他DisplayObject都可以做到这一点。
另请注意,如果您只是将CLICK事件侦听器附加到一个简单的空白新MovieClip对象,那么您永远不会触发该事件,因为您永远无法点击它。您无法单击它,因为您没有在该动画片段中放置任何可物理点击的内容。以下代码应按预期工作:
package button
{
import flash.display.*;
import flash.events.*;
public class Button extends MovieClip
{
public var mybutton:MovieClip;
public function Button () {
mybutton = new MovieClip();
mybutton.graphics.beginFill(0, 1);
mybutton.graphics.drawRect(0,0,200,200);
mybutton.graphics.endFill();
if(stage){
stage.addChild(mybutton);
}
mybutton.buttonMode = true;
mybutton.fromFile.addEventListener (MouseEvent.CLICK , handle )
}
}
}