【问题标题】:Using CREATE_FUNC in Cocos2dx在 Cocos2dx 中使用 CREATE_FUNC
【发布时间】:2014-03-03 16:25:42
【问题描述】:

谁能解释一下为什么我们需要在 Cocos2dx 中使用 CREATE_FUNC?我在 HelloWorld 示例中看到它并没有清楚地理解它。请告诉我更多细节。谢谢。

【问题讨论】:

    标签: cocos2d-x


    【解决方案1】:

    我们不需要使用它,它是一个辅助宏,扩展为:

    /**
     * define a create function for a specific type, such as CCLayer
     * @__TYPE__ class type to add create(), such as CCLayer
     */
    #define CREATE_FUNC(__TYPE__)
    static __TYPE__* create()
    {
        __TYPE__ *pRet = new(std::nothrow) __TYPE__();
        if (pRet && pRet->init())
        {
            pRet->autorelease();
            return pRet;
        }
        else
        {
            delete pRet;
            pRet = NULL;
            return NULL;
        }
    }
    

    它基本上为您的类型“写入”create() 方法,并调用您的init() 实现。它的主要目的是调用autorelease() 方法,这样您就不会忘记它,如果您要编写自己的create()。它可能看起来没有那么多,但它需要你一点点。

    提示:在大多数 IDE 中,您可以 Control + Click(MAC 上的命令)处理函数和宏等代码片段,IDE 会带您前往。

    如果还有什么不清楚的地方请告诉我。

    编辑: 评论中的问题:具体来说,如果我想编写一个从 CCSprite 扩展的 CCCarSprite 并具有更多功能,例如运行、崩溃...我需要调用 CREATE_FUNCTION(CCCarSprite) 吗?

    不,你没有。您要做的是调用超类之一init… 方法。这最好通过您的构造函数或子类中的init() 完成。

    编辑 2: 评论中的第二个问题:还有一个问题,在 Cocos2dx 的 HelloWorld 示例中,为什么他们需要手动调用 CREATE_FUNCTION? 不需要,但在与 cocos 合作时使用他们的宏可能被认为是“好习惯”,因为当他们在新版本的宏实现的 create() 函数中发生某些事情时,他们只需要更新它一处 - 宏定义。这减少了出错的空间,因为几乎没有机会“忘记”将代码更改为新版本的地方。

    【讨论】:

    • 具体来说,如果我想编写一个从 CCSprite 扩展而来的 CCCarSprite 并具有更多的功能,如运行、崩溃...我需要调用 CREATE_FUNCTION(CCCarSprite) 吗?
    • 还有一个,在Cocos2dx的HelloWorld示例中,为什么需要手动调用CREATE_FUNCTION?
    【解决方案2】:

    在你的函数中定义 CREATE_FUNC 宏的更令人信服的原因(除了内存管理)是,如果不声明它,你的 init() 方法将永远不会被调用。(查看宏扩展中的这段代码 = > if (pRet && pRet->init()))

    所以这实际上不仅仅是内存管理。您可以尝试将日志放入您的 init 方法并实际检查以验证这一点。

    【讨论】:

    • 好答案。我是 Cocos2d-x 的新手(经过几年的 Cocos2D-Iphone)并且很难理解所有关于节点结构/生命周期的事情 - 它从未在任何文档中描述过。至少我从来没有找到过。我们应该如何初始化节点/精灵的子节点,发送一些参数?
    【解决方案3】:

    CREAT_FUNC(ClassName) 只是一个帮助我们缩短代码的宏。 它包含默认的ClassName *create()bool init() 函数。 完成之后,你应该在你的ClassName.cpp 文件上实现bool ClassName::init()。 您可以显示定义的详细信息,然后您会发现。希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 1970-01-01
      相关资源
      最近更新 更多