0

晚上好,提前感谢您的智慧。

如果我表现出无知,请容忍我,但这是我的项目目前的构建方式:

-TitleScreen:出现的第一类。扩展雪碧。-Startup:我用来调用其他类的类。扩展雪碧。-GameScreen:“游戏引擎”类。扩展 AssetsHandler。-AssetsHandler:大多数操作资产的方法所在。扩展 GrfAssetsStore。-GrfAssetsStore:存储所有图形资产的地方。扩展雪碧。-Level01:一级班。扩展游戏屏幕。

现在:当我启动一切时,一切都是笨拙的。所以,假设我完成了第 1 关,我想重新开始,或者转到标题屏幕:再次没有问题,但是我重新实例化了 GameScreen 类 - 然后是 AssetsHandler,然后是 GrfAssetsStore。请注意,我没有设置任何事件监听器来调用它们——事实上,我试图确保一旦启动,它们就不会受到干扰——但在我的无知中,我现在意识到重新启动 Level01 反过来又会重新扩展其他类。

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

目标几乎是让 GameScreen、AssetsHandler 和 GrfAssetsStore 在引擎盖下运行,可以这么说,在开始和结束新关卡的同时,又不重新启动超类,只是从它们那里获取方法/变量等。

那么:我该如何克服呢?不,我在 AS3 方面的经验并不丰富,所以如果这对实际专家来说是显而易见的,我很感激,因此我在这里。

如果我需要更好的措辞,请不要犹豫。

编辑:我认为现在的问题不是扩展,而是我没有正确取消引用变量等,感谢 Josh 帮助我实现了这一点。正如您所提到的,否认 OOP 的主要方面之一是没有意义的:因此,我不应该考虑应用这种不正确的逻辑。

在我正确删除所有引用之前,我将尝试更好的 GC(并在必要时强制 GC)。如果这不起作用......我会发布另一个更详细的问题。

4

1 回答 1

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 原则,因此是一种备受争议的设计模式。我认为这在这种情况下有效,因为您不希望在任何给定时间运行多个游戏实例,但在大多数情况下,您应该编写代码以避免这种模式。

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

于 2013-10-02T23:42:52.497 回答