Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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 如何使用按钮控制电影剪辑?_Actionscript 3 - Fatal编程技术网

Actionscript 3 如何使用按钮控制电影剪辑?

Actionscript 3 如何使用按钮控制电影剪辑?,actionscript-3,Actionscript 3,动作脚本新手。 ActionScript3.0 从以下教程开始: 只要代码保留在Flash文件中,一切正常。当我将其移动到外部文件时,我遇到了问题 我的动作层关键帧上有以下代码: stop(); function goHome (e:MouseEvent):void{ gotoAndStop("Home"); } home_btn.addEventListener(MouseEvent.CLICK, goHome); function goAbout (e:MouseEvent):v

动作脚本新手。 ActionScript3.0 从以下教程开始: 只要代码保留在Flash文件中,一切正常。当我将其移动到外部文件时,我遇到了问题

我的动作层关键帧上有以下代码:

    stop();

function goHome (e:MouseEvent):void{
gotoAndStop("Home");
}
home_btn.addEventListener(MouseEvent.CLICK, goHome);

function goAbout (e:MouseEvent):void{
gotoAndStop("About");
}
about_btn.addEventListener(MouseEvent.CLICK, goAbout);

function goLinks (e:MouseEvent):void{
gotoAndStop("Links");
}
links_btn.addEventListener(MouseEvent.CLICK, goLinks);

function goContact (e:MouseEvent):void{
gotoAndStop("Contact");
}
contact_btn.addEventListener(MouseEvent.CLICK, goContact);
一切正常,但我想把代码移到一个外部as3文件中,我遇到了一些问题

我添加了文档类“site1”,这是我的外部文件的名称。我从flash文件关键帧中删除了代码,并将其移动到外部文件

以下是我的site1.as中显示的代码

    package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.text.TextField;

public class button extends MovieClip{

    public function button() {
        function goHome (e:MouseEvent):void{
gotoAndStop("Home");
}
home_btn.addEventListener(MouseEvent.CLICK, goHome);

function goAbout (e:MouseEvent):void{
gotoAndStop("About");
}
about_btn.addEventListener(MouseEvent.CLICK, goAbout);

function goLinks (e:MouseEvent):void{
gotoAndStop("Links");
}
links_btn.addEventListener(MouseEvent.CLICK, goLinks);

function goContact (e:MouseEvent):void{
gotoAndStop("Contact");
}
contact_btn.addEventListener(MouseEvent.CLICK, goContact);
    }
}
}
问题是,当我发布我的Flash文件时,它只是不断循环,而不是暂停按钮点击


任何帮助都将不胜感激。

一个类由属性和函数组成:通常是一个构造函数,该构造函数在类实例化后立即运行(在文档类中,该构造函数在应用程序运行后立即运行),然后是以不同方式调用的其他函数

您所做的是将所有函数都放在构造函数中:不好。这就是把一个函数放在一个函数中,你只是不这样做(虽然从技术上讲,你可以做匿名函数,但那是另一回事)

此外,应该在构造函数中添加事件侦听器。添加事件侦听器就是调用一个函数,(据我所知)不能从其他函数之外的类调用函数

基本上,您应该将函数从构造函数中取出,如下所示:

package{

    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.text.TextField;

    public class button extends MovieClip{

        public function button() {
            home_btn.addEventListener(MouseEvent.CLICK, goHome);
            about_btn.addEventListener(MouseEvent.CLICK, goAbout);
            links_btn.addEventListener(MouseEvent.CLICK, goLinks);
            contact_btn.addEventListener(MouseEvent.CLICK, goContact);
        }

        function goHome (e:MouseEvent):void{
            gotoAndStop("Home");
        }

        function goAbout (e:MouseEvent):void{
            gotoAndStop("About");
        }

        function goLinks (e:MouseEvent):void{
            gotoAndStop("Links");
        }

        function goContact (e:MouseEvent):void{
            gotoAndStop("Contact");
        }
    }
}
另一件事是文件名应该与类名相同。也就是说,您的文档类应该被称为
按钮.as
,而不是
site1.as
。我不完全确定它在flashide中是否是100%必需的(我使用它已经有一段时间了),因为它没有给出一个错误,但即使它不是,这也是一个很好的实践


研究类是如何工作的,并具体记录类是一个好主意,和。

使用相同的名称命名您的类和文件。我建议使用以下代码

package
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    import flash.text.TextField;

    public class YourClassName extends MovieClip
    {
        public function YourClassName() {
            home_btn.addEventListener(MouseEvent.CLICK, goHome);
            about_btn.addEventListener(MouseEvent.CLICK, goAbout);
            links_btn.addEventListener(MouseEvent.CLICK, goLinks);
            contact_btn.addEventListener(MouseEvent.CLICK, goContact);          
        }

        private function goHome(e:MouseEvent):void {
            gotoAndStop("Home");
        }       

        private function goAbout(e:MouseEvent):void {
            gotoAndStop("About");
        }

        private function goLinks(e:MouseEvent):void {
            gotoAndStop("Links");
        }

        private function goContact(e:MouseEvent):void {
            gotoAndStop("Contact");
        }

    }
}
AS3比AS2更明确。我建议您使用
private
/
public
访问器

编辑

“button”不是一个很好的类名,但它会起作用

1) 将文件、类和构造函数命名为“button”:

public class button extends MovieClip

public function button()
2) 确保你的链接是好的!意思:如果您想用这个类控制整个电影,请更改
按钮
的文档“class”名称,如果您只想控制库中的一个电影剪辑,请将其拖到舞台上,选中“导出动作脚本”,并更改
按钮
的“class”值

认为使用此方法,您不需要任何实例名称。在这种情况下,类链接就足够了

参考:


我刚刚纠正了我的代码,因为我忘了将事件侦听器添加到构造函数中。然而,Eric的回答有一点是关于使用
private
/
public
访问器指定函数的范围的:虽然它们本质上不是,但通常最好是为了清晰而指定它们,如果没有其他的话。这给了我以下错误“TypeError:Error#1009:无法访问空对象引用的属性或方法。at button()”请参阅我的编辑。我想你的问题更多的是关于“如何与AS3进行文档链接或类链接?”如果我确实理解了问题。除了注意给出的答案外,还可以尝试添加
stop();
作为时间轴第1帧(或任何需要停止的帧)上的操作。这将停止电影在所有帧中播放和循环,但可以通过单击按钮转到帧标签