使用文档 类 在 actionscript 中将 fla 文件链接在一起
linking fla files together in actionscript using document classes
我在 actionscript3 工作,由于我是自学成才,我想我养成了一些坏习惯,包括在时间轴上编码和使用多个场景。
现在我正在处理一个更大的项目,我希望纠正这个问题。
根据我的阅读,link将多个 .fla 文件放在一起是更好的做法,每个文件都有自己的文档 class。对吗?
如果是这样,我如何加载一个 .fla 及其文档 class 然后 link 将其加载到后续的 .fla 文件中(而不是使用场景)?还是我误解了推荐的内容?
谢谢!
没有必要将您的应用程序拆分为多个可加载模块,除非您有以下任何先决条件:
- 您有智能资源管理来加载和卸载内容
- 如果您将所有内容都放入一个文件中,那么它会变得太大并且难以在设计时使用,或者编译时间太长
使用场景的常规 AS3 替代方法是 creating/destroying 内容实例并使用主文档 class 作为它们的管理器。您在库中设计内容并为它们创建行为 AS3 classes。比方说,你有两个内容 classes 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重新完成。
如果您有很多这样的页面,则需要采用更多算法方法。例如,要创建 class 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 将始终有一个当前页面,一旦需要显示另一个页面,当前将定期销毁。每个页面 class 将倾向于其自己的内容,这使得编码更简单,因为您不需要看到整个图片。如果您需要任何持久数据,请将其保存在 PageManager 中,这样每个页面都可以访问数据,而无需页面相互通信。
我在 actionscript3 工作,由于我是自学成才,我想我养成了一些坏习惯,包括在时间轴上编码和使用多个场景。
现在我正在处理一个更大的项目,我希望纠正这个问题。
根据我的阅读,link将多个 .fla 文件放在一起是更好的做法,每个文件都有自己的文档 class。对吗?
如果是这样,我如何加载一个 .fla 及其文档 class 然后 link 将其加载到后续的 .fla 文件中(而不是使用场景)?还是我误解了推荐的内容?
谢谢!
没有必要将您的应用程序拆分为多个可加载模块,除非您有以下任何先决条件:
- 您有智能资源管理来加载和卸载内容
- 如果您将所有内容都放入一个文件中,那么它会变得太大并且难以在设计时使用,或者编译时间太长
使用场景的常规 AS3 替代方法是 creating/destroying 内容实例并使用主文档 class 作为它们的管理器。您在库中设计内容并为它们创建行为 AS3 classes。比方说,你有两个内容 classes 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重新完成。
如果您有很多这样的页面,则需要采用更多算法方法。例如,要创建 class 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 将始终有一个当前页面,一旦需要显示另一个页面,当前将定期销毁。每个页面 class 将倾向于其自己的内容,这使得编码更简单,因为您不需要看到整个图片。如果您需要任何持久数据,请将其保存在 PageManager 中,这样每个页面都可以访问数据,而无需页面相互通信。