Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 课堂上的MovieClip按钮_Actionscript 3_Flash - Fatal编程技术网

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
代码创建了一个movieclip
Homebtn
,我用它来测试代码。您已经添加了自己的
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);