试过这个,
package {
import flash.display.MovieClip;
import flash.events.*;
public class test extends MovieClip {
public function test() {
addEventListener(Event.ADDED_TO_STAGE, registerBtn);
}
private function registerBtn(e:Event):void {
this.parent["Homebtn"].addEventListener(MouseEvent.CLICK, myButtonClick);
}
private function myButtonClick(e:MouseEvent):void {
trace("CLICKED");
}
}
}
第1帧上的代码相同,并且舞台上有一个MovieClip Button,其实例名称为“Homebtn”。
答案 0 :(得分:2)
import flash.events.*;
从源自flash
的包中导入所有类对编译大小没有任何影响,因为它们已存在于Flash Player运行时环境中。您需要明确声明这些导入是纯粹的单调,但在处理第三方软件包时这是一种很好的做法。
文档代码(即Flash IDE时间轴中的代码)与MainTimeline
有直接关系,而类文件则没有。如果您想将button1.addEventListener(MouseEvent.CLICK, myButtonClick);
添加到您的课程中,除非您:
A:在实例化test
类时,将指针指向该类的按钮/ stage / root:
var myObj:test = new test(root)
B:等待添加事件监听器,直到您为test
对象提供与要从其转到按钮的阶段的父关系为止:
addChild(test);
你班上的......
public function test() {
// constructor code
addEventListener(Event.ADDED_TO_STAGE, registerBtn)
}
private function registerBtn():void {
this.parent.button1.addEventListener(MouseEvent.CLICK, myButtonClick);
}
要查找错误原因,您需要调试代码。如果您使用的是Flash IDE CS6,则可以通过转到发布设置并启用“允许调试”来启用此功能。这将带来你的模棱两可的错误......
null object reference at myDocument/doSomething()
......更清楚......
null object reference at myDocument/doSomething() package\myClass.as:20
...现在表示代码中的哪一行可以查找您的问题。
使用调试编译模式打开调试控制台。这将使您立即查看相关代码行,以及调用堆栈和所有可用变量的状态。没有程序员就没有它。
通过进入菜单“Debug> Debug Movie> Debug”运行,或使用键盘组合 CONTROL + SHIFT + ENTER
既然你掌握了自己的专业知识,我将会介绍你遇到的问题,以及你如何解决它(因为你是新手)。
首先,flash.events
带有“s”。所以我们会改变它。
接下来,编译它我们会得到以下错误:
因此,我们在test.as
课程的第7行看到:您已将时间轴代码放入课程中。
var myObj:test = new test(root);
addChild(test);
您不希望从内部实例化您的类,因为它永远不会被实例化。将您的代码视为铁路。列车以您的时间轴代码开始,并且仅在之前设置的轨道上运行。你的班级浮到一边,准备好所有有趣的转弯和曲折,但你必须将它添加到轨道才能实际运行。这是实例化;我们将那条路径复制到当前轨道上,然后火车就在它上面运行。
所以,我们摆脱了第6和第6行。 7,我们留下了Access of possibly undefined property Homebtn
。致电this.parent
实际上是getter function,并返回DisplayObjectContainer
。因为AS3是strongly datatyped语言,所以编译器会知道DisplayObjectContainers(傻编译器)上没有这样的属性“Homebtn”。但是,当然,你知道它存在(或者至少它将在此代码运行时)。一种简单的解决方法是在运行时评估引用。
this.parent["Homebtn"].addEventListener(MouseEvent.CLICK, myButtonClick);
通过将按钮名称封装为字符串并在括号内,我们已经完成了。
现在我们再次重新编译,并获得以下内容:
这是因为所有event listeners都接收一个参数:一个事件对象。您可能不会使用它,但没有变量来保存它是 no-no 。
private function registerBtn(e:Event):void {
最后一点。所有类函数都需要表示它们存在的namespace。myButtonClick
需要一个,因此我们将其添加为private
,因为没有外部(即非基于类) )函数需要访问它。
以下是您修改后的代码:
package {
import flash.display.MovieClip;
import flash.events.*;
public class test extends MovieClip {
public function test() {
addEventListener(Event.ADDED_TO_STAGE, registerBtn);
}
private function registerBtn(e:Event):void {
this.parent["Homebtn"].addEventListener(MouseEvent.CLICK, myButtonClick);
}
private function myButtonClick(e:MouseEvent):void {
trace("CLICKED");
}
}
}
import test;
var Homebtn:MovieClip = new MovieClip();
Homebtn.graphics.beginFill(0xFF0000, 1);
Homebtn.graphics.drawRect(0, 0, 150, 25);
Homebtn.graphics.endFill();
addChild(Homebtn);
var testObj:test = new test();
addChild(testObj);