2013-10-02 50 views
0

傍晚,并提前感谢您的智慧。AS3:避免同一类别的多个实例

熊与我,如果我表现出的无知,但这里是我的项目是如何建成目前:

-TitleScreen:这似乎是一流的。扩展Sprite。 -Startup:我用来调用其他类的类。扩展Sprite。游戏画面:“游戏引擎”类。扩展AssetsHandler。 -AssetsHandler:其中大多数操作资产的方法都是。扩展GrfAssetsStore。 -GrfAssetsStore:其中存储所有图形资产。扩展Sprite。 -Level01:一级课程。扩展GameScreen。

现在:当我开始一切时,一切都是h d。所以,假设我完成了第一级,并且我想重新启动,或者转到标题屏幕:再次没有问题,但是我重新实例化了GameScreen类,接着是AssetsHandler,接着是GrfAssetsStore。请注意,我没有设置任何将其称为回复的EventListener,我试图确保一旦启动,它们将不受干扰 - 但在我的无知中,我现在已经意识到重新启动Level01会再次延长其他类。

可以理解,这是非常不可取的,但到目前为止我无法克服它。我尝试在Level01中实例化超类,它同样存在问题。

目标很大程度上是在引擎盖下运行GameScreen,AssetsHandler和GrfAssetsStore,可以这么说,新层次开始和结束时,但又没有重新启动超类,只是从中获取方法/变量等。

所以:我该如何克服这个问题?不,我在AS3方面经验不足,所以我很感谢这对于实际的专家是显而易见的,因此我为什么在这里。

如果我需要更好地说一些话,请不要犹豫,说这样的话。

编辑:现在的问题我相信不是扩展,但我没有正确地引用变量等,谢谢乔希帮助我实现这样的。正如你所提到的,否认OOP的一个主要方面是没有意义的:因此我应该考虑不应用那种不正确的逻辑。

我会尝试更好地GC(并强制GC,如果有必要),直到我已正确删除所有引用。如果这不起作用,但我会发布另一个更详细的问题。

+0

为什么要重新实现level01一个问题?为什么这是不可取的? –

+0

重新启动Level01不是问题,因为在重新启动之前我已经从它删除所有的孩子:prob是扩展类被重新调用,复制所有这些类变量,儿童,监听器等,并导致不一致和内存负担 – ReaperOscuro

回答

1

您可以将它设置为Singleton。

基本结构:

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()当然)

请注意,这不是一个应该经常使用的设计模式,如果有的话。它违背了基本的面向对象原则,因此也是一个备受争议的设计模式。我认为在这种情况下这是有效的,因为您不希望在任何给定时间运行多个游戏实例,但在大多数情况下,您应该编写代码以避免此模式。

http://en.wikipedia.org/wiki/Singleton_pattern

+1

http://gskinner.com/blog/archives/2006/07/as3_singletons.html – Pier

+0

@Pier很好找。格兰特斯金纳的AS3文档是其中最好的。 –

+0

非常感谢乔希 - 尽管如此,使用一个功能来解决面向对象的最佳方面似乎很愚蠢,无论如何,我会给它一个甘德,看看我该怎么去。 – ReaperOscuro

相关问题