使用文档类将FLA文件链接在一起



我在ActionScript3工作,并且由于我是自学成才的,我认为我已经养成了一些不良习惯,包括在时间轴上编码和使用多个场景。

我希望既然正在从事一个更大的项目。

根据我阅读的内容,将多个.fla文件链接在一起是一个更好的练习,每个练习都有自己的文档类。这是正确的吗?

如果是这样,如何将一个.fla与其文档类加载,然后将其链接到后续的.fla文件(而不是使用场景)?还是我误解了推荐的内容?

谢谢!

除非有以下任何先决条件:

  • 您有智能资源管理可以加载和卸载内容
  • 如果将所有内容都放入一个文件中,它将变得太大且在设计时间很难使用,否则需要花费太长时间

常规AS3使用场景的替代方案是创建/破坏内容实例,并将主要文档类作为其经理。您在库中设计内容,并为其创建行为AS3类。可以说,您有两个内容类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(),该方法()释放使用资源,从事件中取消订阅方法,删除显示对象等等,并且它们都应触发事件。完成后。<<<<<<<<

如果您有很多这样的页面,则需要选择更多算法的方法。例如,创建将与Manager进行交互的类BASICPAGE,并具有已经声明的所有页面中所需的方法:

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中,以便每个页面都可以访问数据,而无需页面相互通信。

最新更新