Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer

Posted

技术标签:

【中文标题】Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer【英文标题】:Cocos2d | Arc Enabled - Create a Singleton BaseLayer which manages the rest of the layers 【发布时间】:2014-08-16 16:18:28 【问题描述】:

希望一切都好。我在这里有一个稍微复杂且令人难以置信的问题,并且迫切需要您的帮助。我正在尝试在已经建立的基于 ARC 的应用程序中设置一个 Cocos2d 2.x 环境,该应用程序为第三方库提供娱乐,因此一些类启用了 ARC,而另一些类(如 Cocos2d 类)则没有。无论如何,幸运的是 Cocos2d 可以正常工作,但就像我以前禁用的 ARC 游戏环境一样,此代码不支持 SynthesizeSingleton.h,这是我非常喜欢的一个类。相反,我做了一些研究并掌握了许多启用 ARC 的单例解决方案,其中一个在 this post 中进行了描述。

无论如何,我需要向你解释一下我是如何管理我的游戏环境的。就像 Apple 强烈推荐的那样,MVC 模式将我的模型与视图分开,控制有助于连接一切。同样,所有视图都是从一个包含 BaseLayer 的主场景处理的。所有其他层都是这个 BaseLayer 的子层,它本身是一个单例,因此管理所有其他层,即我有我唯一的奇异场景,它添加一个 BaseLayer,BaseLayer 根据它们的 Z-Index 添加所有其他层或如果不需要,则销毁它们。在我所有未启用 ARC 的项目中,这工作正常,但不知何故 dispatch_once_t 不会执行一次,但总是因此实例被重置并且单例无法像承诺的那样执行。我该怎么办? :(

【问题讨论】:

【参考方案1】:

出于某种原因,这个项目和第 8 章中 source code 中的 GameScene 帮助我产生了一个非常简单但不那么整洁的解决方案:

最简单的解决方案是:

static MyBaseLayer *sharedMyBaseLayer = nil;

紧随其后,

+ (MyBaseLayer*)sharedMyBaseLayer

    NSAssert(sharedMyBaseLayer != nil, @"BaseLayer instance not yet initialised!");
    return sharedMyBaseLayer;

然后使用场景初始化设置sharedMyBaseLayer实例的层:

+(CCScene *) scene


    CCScene *scene = [CCScene node];
    // 'layer' is an autorelease object.
    MyBaseLayer *layer = [MyBaseLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;


-(id)init

    if(self = [super init])
    
        sharedMyBaseLayer = self;
    
    return self;

这给了我一个美丽的单例实例,它永远不会重新启动并且很好地服务于我的目的。无论多线程有多么缺陷,它对我来说都很好。如果有任何其他想法出现,请及时更新我。

【讨论】:

【参考方案2】:

我不明白你的单例的目的,但你像这样创建它们(没有全局静态变量):

+ (id)sharedManager

    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^
    
        sharedMyManager = [[self alloc] init];
    );

    return sharedMyManager;

dispatch_once 是线程安全的。我觉得你想多了。我真的不明白单例与 MVC 有什么关系,或者你为什么要尝试做你的 OP 所说的。

MVC 的重点是拥有数据(模型)、视图(表示)和控制器(将它们联系在一起的粘合剂),以便您可以进行大量代码重用。 cocos2d 不是围绕这个构建的,但即使你想这样做,singleton 也与此无关。

您仍然可以以非 cocos2d 特定方式重用的方式分离模型数据和逻辑,但我不知道全局层如何实现这一点。

【讨论】:

以上是关于Cocos2d | Arc Enabled - 创建一个管理其余层的 Singleton BaseLayer的主要内容,如果未能解决你的问题,请参考以下文章

在故事板项目中嵌入 cocos2d

Cocos2d CCSpirte runAction 问题

在 ARC 中启动新的 Cocos2d-iPhone 项目后出现内存警告。初学者

ARC与MRC

cocos2d_android 第一个游戏

预定方法中的 addChild