我在 actionscript3 工作,由于我是自学成才,我想我已经养成了一些坏习惯,包括在时间轴上编码和使用多个场景。
现在我正在做一个更大的项目,我希望能纠正这个问题。
根据我所阅读的内容,将多个 .fla 文件链接在一起是一种更好的做法,每个文件都有自己的文档类。那是对的吗?
如果是这样,我如何加载一个 .fla 及其文档类,然后将其链接到后续的 .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() 来释放使用的资源、从事件中取消订阅方法、删除显示对象等等,并且它们都应该在完成后触发 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 中,这样每个页面都可以访问数据,而无需页面相互通信。