在Cocos2dx中使用CREATE_FUNC

时间:2014-03-03 16:25:43

标签: cocos2d-x

任何人都可以解释我为什么需要在Cocos2dx中使用CREATE_FUNC?我在HelloWorld示例中看到了它并且不清楚它。请告诉我更多细节。感谢。

3 个答案:

答案 0 :(得分:15)

我们不需要使用它,它是一个帮助宏扩展到这个:

/**
 * 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将带您进入。

如果有些事情仍然不明确,请告诉我。

编辑: 来自评论的问题:具体来说,如果我想写一个CCCarSprite,它扩展自CCSprite并且有更多的功能,比如run,crash ......我是否需要调用CREATE_FUNCTION(CCCarSprite)?

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

编辑2: 来自评论的第二个问题:在Cocos2dx的HelloWorld示例中,为什么还需要手动调用CREATE_FUNCTION? 不需要,但可以考虑"良好做法"当使用cocos来使用它们的宏时,因为当它们在新版本中由宏实现的create()函数中进行某些操作时,它们只需要在一个地方更新它 - 宏定义。这样可以减少出错的空间,因为几乎没有机会忘记"关于将代码更改为新版本的地方。

答案 1 :(得分:3)

在函数中定义CREATE_FUNC宏(除了内存管理)之外更有说服力的理由是,在不声明这一点的情况下,永远不会调用init()方法。(在宏扩展中查看这段代码= > if(pRet&& pRet-> init() ))

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

答案 2 :(得分:0)

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