2017-03-06 33 views
1

我正在使用actionscript3,由于我是自学成才的,我认为自己已经开发了一些不良习惯,包括在时间轴上编码和使用多个场景。使用文档类在动作脚本中将fla文件链接在一起

我希望现在纠正这个问题,我正在研究一个更大的项目。

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

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

谢谢!

+1

您是否尝试阅读互联网上的教程?这里有一个[**有用的指南**](https://code.tutsplus.com/tutorials/how-to-use-a-document-class-in-flash-active-3233)。你不使用多个FLA。一个FLA成为您的应用的主要出发点。之后,您可以使用更多功能来“导入”其他AS文件。如果您在网络FLa中有音频/视频内容,请将其编译为SWF。在您的主应用程序中,只需加载SWF即可访问SWF自己的内容或自己的功能。 –

回答

1

有没有点在几个可加载模块分割你的应用程序,除非你有任何以下先决条件:

  • 你有智能资源管理,如果你把所有的东西放到一个文件来加载和卸载内容
  • 它变得太大,很难在设计时间与工作或编译

定期AS3替代使用场景是创建/销毁内容实例中使用该主文件CL花费的时间太长了作为他们的经理。您在库中设计内容并为它们创建行为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()释放使用的资源,取消订阅事件的方法,移除显示对象等等,并且它们都应该在事件完成时触发Event.CLOSE。

如果你有很多这样的页面,你需要去更多的算法方法。例如,创建一流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中,以便每个页面都可以访问数据,而无需网页彼此进行通信。

相关问题