Actionscript 3 使用文档类在actionscript中将fla文件链接在一起

Actionscript 3 使用文档类在actionscript中将fla文件链接在一起,actionscript-3,flash,actionscript,fla,Actionscript 3,Flash,Actionscript,Fla,我在actionscript3工作,由于我自学成才,我想我已经养成了一些坏习惯,包括在时间轴上编码和使用多个场景 我希望纠正这一点,现在我在一个更大的项目工作 根据我所读的内容,将多个.fla文件链接在一起是一种更好的做法,每个文件都有自己的文档类。对吗 如果是这样,我如何加载一个.fla及其文档类,然后将其链接到后续的.fla文件中(而不是使用场景)?还是我误解了他们的建议 谢谢 除非您具备以下任何先决条件,否则没有必要将应用程序拆分为多个可加载模块: 您可以使用智能资源管理来加载和卸载内容

我在actionscript3工作,由于我自学成才,我想我已经养成了一些坏习惯,包括在时间轴上编码和使用多个场景

我希望纠正这一点,现在我在一个更大的项目工作

根据我所读的内容,将多个.fla文件链接在一起是一种更好的做法,每个文件都有自己的文档类。对吗

如果是这样,我如何加载一个.fla及其文档类,然后将其链接到后续的.fla文件中(而不是使用场景)?还是我误解了他们的建议


谢谢

除非您具备以下任何先决条件,否则没有必要将应用程序拆分为多个可加载模块:

  • 您可以使用智能资源管理来加载和卸载内容
  • 如果您将所有内容都放在一个文件中,那么在设计时它会变得太大、太难处理,或者编译起来需要太长时间
使用场景的常规AS3替代方法是创建/销毁内容实例,并使用主文档类作为其管理器。您可以在库中设计内容,并为其创建行为3类。假设您有两个内容类A和B。开始时,经理应显示其中一个,并等待信号显示下一个:

private var APage:A;
private var BPage:B;

gotoA();

function gotoA():void
{
    if (BPage)
    {
        BPage.destroy();
        removeChild(BPage);
        BPage.removeEventListener(Event.CLOSE, gotoA);
    }

    APage = new A;
    APage.addEventListener(Event.CLOSE, gotoB);
    addChild(APage);
}

function gotoB():void
{
    if (APage)
    {
        APage.destroy();
        removeChild(APage);
        APage.removeEventListener(Event.CLOSE, gotoB);
    }

    BPage = new B;
    BPage.addEventListener(Event.CLOSE, gotoA);
    addChild(BPage);
}
因此,A和B都应该有各自的方法.destroy(),用于释放已使用的资源、取消订阅事件中的方法、删除显示对象等,并且它们都应该在完成后激发Event.CLOSE

如果你有很多这样的页面,你需要更多的算法方法。例如,要创建类BasicPage,它将与manager交互,并已声明所有页面中所需的方法:

package
{
    import flash.display.Sprite;

    class BasicPage extends Sprite
    {
        // A reference to the page manager instance.
        public var Manager:PageManager;

        public function destroy():void
        {
            while (numChildren > 0) removeChildAt(0);

            Manager = null;
        }

        // Subclasses will have an access to this method to tell manager to show another page.
        protected function showOtherPage(pageClass:Class):void
        {
            Manager.showPage(pageClass);
        }

        // A method that is called by manager when everything is ready.
        // If page should take any actions on start it is a good idea to override this method.
        public function startEngine():void
        {
        }
    }
}
然后,示例页面A:

package
{
    import flash.events.MouseEvent;

    public class A extends BasicPage
    {
        // Lets say, class A in library have a designed button named Click.
        public var Click:SimpleButton;

        // We have things to undo here.
        override public function destroy():void
        {
            Click.removeEventListener(MouseEvent.CLICK, onClick);
            Click = null;

            // Pass the destruction to superclass so it wraps its existence either.
            super.destroy();
        }

        override public function startEngine():void
        {
            Click.addEventListener(MouseEvent.CLICK, onClick);
        }

        private function onClick(e:MouseEvent):void
        {
            // Lets use inherited method to show other page.
            showOtherPage(B);
        }
    }
}
因此,PageManager将类似于:

package
{
    public class PageManager extends Sprite
    {
        private var Page:BasicPage;

        // constructor
        function PageManager()
        {
            super();
            showPage(A);
        }

        function showPage(pageClass:Class):void
        {
            if (Page)
            {
                Page.destroy();
                removeChild(Page);
                Page = null;
            }

            Page = new pageClass;
            Page.Manager = this;

            addChild(Page);
            Page.startEngine();
        }
    }
}

这一切一开始可能看起来很可怕,但事实并非如此。PageManager将始终有一个当前页面,一旦需要显示另一个页面,当前页面将定期销毁。每个页面类将倾向于自己的内容,这使得编码更简单,因为您不需要看到整个画面。如果您需要任何持久性数据,请将其保存在PageManager中,这样每个页面都可以访问这些数据,而不需要页面之间进行通信。

您是否尝试过在internet上阅读教程?这是一个例子。你不能使用多个FLA。一个FLA成为应用程序的主要起点。之后,您可以
导入
其他具有更多功能的文件等。如果您在网络FLa中有音频/视频内容,则将其编译为SWF。在主应用程序中,只需加载SWF即可访问SWF自己的内容或功能。