傍晚,并提前感谢你的智慧。
如果我表现出无知,请耐心等待,但这是我目前的项目建设方式:
-TitleScreen:出现的第一堂课。扩展Sprite。 -Startup:我用来调用其他类的类。扩展Sprite。 -GameScreen:“游戏引擎”类。扩展AssetsHandler。 -AssetsHandler:大多数操纵资产的方法都在哪里。扩展GrfAssetsStore。 -GrfAssetsStore:存储所有图形资源的位置。扩展Sprite。 -Level01:第一级课程。扩展GameScreen。
现在:当我开始一切时,一切都是笨拙的。所以,假设我完成了1级,我想重新启动,或者转到标题屏幕:再没有问题,但我重新实例化了GameScreen类 - 反过来又是AssetsHandler,反过来又是GrfAssetsStore。请注意,我没有设置任何调用它们的EventListener -Idedeed,我试图确保一旦启动,它们将不会受到干扰 - 但在我的无知中我现在意识到重新启动Level01反过来又重新扩展其他课程。
可以理解这是非常不受欢迎的,但到目前为止,我无法克服它。我试着在Level01 -same问题中实例化超类。
目标几乎就是在引擎盖下运行GameScreen,AssetsHandler和GrfAssetsStore,可以这么说,新的关卡开始和结束,但没有反过来重新启动超类,只是从它们那里获取方法/变量等。 / p>
那么:我该如何克服这个问题?不,我在AS3中没有太大的经验,所以如果这对于实际的专家来说是显而易见的,我很感激,因此我为什么会来这里。
如果我需要更好地说出更好的信息,请不要犹豫。
编辑:现在的问题我认为不是扩展,但我没有正确地解释变量等,感谢Josh帮助我实现这一点。正如你所提到的,拒绝OOP的一个主要方面是没有意义的:因此我应该不考虑应用那个不正确的逻辑。我将尝试更好地使用GC(并在必要时强制使用GC),直到我正确删除所有引用。如果这不起作用......我会发布另一个更详细的问题。
答案 0 :(得分:1)
您可以将其设置为单身人士。
基本结构:
public class ClassName {
private static var _instance:ClassName;
public function ClassName() {
// run normal constructor code here
}
public static function get instance():ClassName {
if ( !_instance ) {
_instance = new ClassName();
}
return _instance;
}
}
因此,您只需调用new ClassName()
来访问该类的单个实例,而不是在代码中调用ClassName.instance
。这将每次返回相同的单个实例,并在尚未创建时创建它。这将确保在任何给定时间都不会有多个代码实例(假设您当然不会调用new ClassName()
)
请注意,这不是应该经常使用的设计模式(如果有的话)。它违背了基本的OOP原则,因此是一个备受争议的设计模式。我认为这适用于这种情况,因为您不希望在任何给定时间运行多个游戏实例,但在大多数情况下,您应该编写代码以避免此模式。