MovieClip按钮在课堂上

时间:2014-01-06 06:59:34

标签: 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 function registerBtn(e:Event):void {
            this.parent["Homebtn"].addEventListener(MouseEvent.CLICK, myButtonClick);
        }

        private function myButtonClick(e:MouseEvent):void {
            trace("CLICKED");
        }
    }
}

Image

第1帧上的代码相同,并且舞台上有一个MovieClip Button,其实例名称为“Homebtn”。

1 个答案:

答案 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

...现在表示代码中的哪一行可以查找您的问题。

enter image description here

使用调试控制台

使用调试编译模式打开调试控制台。这将使您立即查看相关代码行,以及调用堆栈和所有可用变量的状态。没有程序员就没有它。

通过进入菜单“Debug> Debug Movie> Debug”运行,或使用键盘组合 CONTROL + SHIFT + ENTER

enter image description here


既然你掌握了自己的专业知识,我将会介绍你遇到的问题,以及你如何解决它(因为你是新手)。

首先,flash.events带有“s”。所以我们会改变它。

接下来,编译它我们会得到以下错误:

enter image description here

因此,我们在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);

通过将按钮名称封装为字符串并在括号内,我们已经完成了。

现在我们再次重新编译,并获得以下内容:

enter image description here

这是因为所有event listeners都接收一个参数:一个事件对象。您可能不会使用它,但没有变量来保存它是 no-no

private function registerBtn(e:Event):void {

最后一点。所有类函数都需要表示它们存在的namespacemyButtonClick需要一个,因此我们将其添加为private,因为没有外部(即非基于类) )函数需要访问它。

以下是您修改后的代码:

test.as

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");
        }
    }
}

test.fla(第1帧上的时间轴代码)

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);