在Cocos2dx中使用CREATE_FUNC

10

有人可以解释一下为什么我们需要在Cocos2dx中使用CREATE_FUNC吗?我在HelloWorld样例中看到了这个,但不是很清楚。请告诉我更多细节。谢谢。

3个回答

18
我们不需要使用它,它是一个帮助宏,它展开成为这个:
/**
 * 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中,您可以单击函数和宏等代码片段,然后IDE将引导您。
如果还有不清楚的地方,请告诉我。
编辑: 评论问题:如果我想编写一个扩展自CCSprite并具有一些其他函数(如run、crash...)的CCCarSprite,我需要调用CREATE_FUNCTION(CCCarSprite)吗? 不需要。您必须调用超类的init…方法之一。最好从子类的构造函数或init()中完成此操作。
编辑2: 评论中的第二个问题:只剩下一个问题,在Cocos2dx的HelloWorld示例中,为什么他们需要手动调用CREATE_FUNCTION? 他们不需要,但在使用cocos时,使用它们的宏可能被视为“最佳实践”,因为当它们在新版本中更改由宏实现的create()函数时,它们只需在一个位置更新宏定义。这样留下的出错空间更少,因为几乎不可能“忘记”更新代码到新版本的地方。

具体来说,如果我想编写一个继承自CCSprite并具有一些额外功能(如run、crash等)的CCCarSprite,我需要调用CREATE_FUNCTION(CCCarSprite)吗? - lolyoshi
在Cocos2dx的HelloWorld示例中,为什么需要手动调用CREATE_FUNCTION呢? - lolyoshi

3

除了内存管理外,定义CREATE_FUNC宏的更加重要的原因是,如果没有声明它,您的init()方法将永远不会被调用。(在宏扩展中查看此代码片段=> if (pRet && pRet->init()))

因此,这实际上不仅限于内存管理。您可以尝试在init方法中放置日志并进行验证。


好的回答。我是Cocos2d-x的新手(在使用Cocos2D-Iphone几年后),很难理解有关节点结构/生命周期的所有内容 - 它从未在任何文档中描述过。至少我从未找到过。我们应该如何初始化节点/精灵的子项,发送一些参数? - Jonny

0

CREAT_FUNC(ClassName) 只是一个宏,帮助我们简化代码。 它包含默认的 ClassName *create()bool init() 函数。 完成后,您应该在您的 ClassName.cpp 文件中实现 bool ClassName::init()。 您可以展示定义的细节,然后您就会发现。希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接