Actionscript 3 课堂上的MovieClip按钮
试过这个,Actionscript 3 课堂上的MovieClip按钮,actionscript-3,flash,Actionscript 3,Flash,试过这个, package { import flash.display.MovieClip; import flash.events.*; public class test extends MovieClip { public function test() { addEventListener(Event.ADDED_TO_STAGE, registerBtn); } private fun
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按钮,实例名为“Homebtn”。
从源于flash
的包中导入所有类对编译大小没有影响,因为它们已经存在于flashplayer运行时环境中。要求您显式地声明这些导入是很单调的,但是在处理第三方软件包时,这是一个很好的实践
阶段关系
文档代码(即Flash IDE时间线中的代码)与主时间线有直接关系,而类文件则没有。如果要添加button1.addEventListener(MouseEvent.CLICK,myButtonClick)代码>对于您的类,您将无法这样做,除非您:
A:实例化测试时,将指向按钮/阶段/根的指针传递给类:
var myObj:test = new test(root)
B:等待添加事件侦听器,直到您为test
对象提供了要遍历到按钮的阶段的父关系:
addChild(test);
在你的课堂上
打开调试
要找到bug的原因,需要调试代码。如果您使用的是Flash IDE CS6,那么可以通过转到发布设置并启用“允许调试”来启用此功能。这将使您的模糊错误
null object reference at myDocument/doSomething()
…更清楚地说
null object reference at myDocument/doSomething() package\myClass.as:20
…现在表示在代码中查找问题的行
使用调试控制台
使用调试编译模式打开调试控制台。这将为您提供有关代码行、调用堆栈以及所有可用变量的状态的即时查看。任何程序员都不应该没有它
通过进入“调试>调试电影>调试”菜单运行,或使用键盘组合控件+SHIFT+ENTER
现在,您已经掌握了独立完成此操作的诀窍,我将介绍您将遇到的问题,以及您将如何修复它(因为您是新手)
首先,它是带有“s”的flash.events
。所以我们要改变这一点
接下来,对其进行编译,我们会得到以下错误:
因此,我们在测试的第7行看到。正如类:您已将时间线代码放入类中
var myObj:test = new test(root);
addChild(test);
您不想从类本身实例化它,因为它永远不会被实例化。把你的代码想象成一条铁路。列车以您的时间线代码开始,仅在之前设置的轨道上运行。您的类正在向一侧浮动,准备好了所有有趣的转弯和之字形,但您必须将其添加到轨道中,才能实际运行。这是实例化;我们正在将这条路径复制到当前轨道上,火车就在这条轨道上运行
因此,我们去掉了第6行和第7行,只剩下访问可能未定义的属性Homebtn
。调用实际上是一个,它返回一个DisplayObjectContainer
。由于AS3是一种语言,编译器将知道DisplayObjectContainers(愚蠢的编译器)上没有此类属性“Homebtn”。但当然,您知道它在那里(或者至少在代码运行时会在那里)。一种简单的解决方法是让它在运行时评估引用
this.parent["Homebtn"].addEventListener(MouseEvent.CLICK, myButtonClick);
通过将按钮名称封装为字符串并放在括号内,我们已经做到了这一点
现在,我们再次重新编译,得到以下结果:
这是因为它们都接收一个参数:一个事件对象。您可以不使用它,但是没有一个变量来保存它是不允许的
作为最后一点。所有类函数都需要表示为它们所存在的内容MyButton单击
需要一个,因此我们将其添加为private
,因为没有外部(即非基于类的)函数需要访问它
这是您修改后的代码:
test.as
test.fla(第1帧上的时间线代码)
尝试导入flash.events
而不是flash.event
,仍然存在同样的问题。@Atriace尝试调试,但无法解决。很抱歉让您失望,但请帮助。谢谢您的支持,我必须感谢您的工作和耐心。我接下来要问的问题会让你失望。但是我需要,我用您提供的代码创建了AS,只是为了测试和理解它。并在第一帧中添加了代码(如您所述)。舞台上有一个Movieclip按钮,实例名为Homebtn。我给你的fla
代码创建了一个movieclipHomebtn
,我用它来测试代码。您已经添加了自己的Homebtn
,但您的是按钮
对象,而不是MovieClip
,这就是它产生错误的原因。如果您去掉第3行到第7行,我怀疑问题会得到解决。或者,如果要使用我提供的那些行,请不要创建名为Homebtn
的按钮。
var myObj:test = new test(root);
addChild(test);
this.parent["Homebtn"].addEventListener(MouseEvent.CLICK, myButtonClick);
private function registerBtn(e:Event):void {
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);