【发布时间】:2014-03-03 16:25:42
【问题描述】:
谁能解释一下为什么我们需要在 Cocos2dx 中使用 CREATE_FUNC?我在 HelloWorld 示例中看到它并没有清楚地理解它。请告诉我更多细节。谢谢。
【问题讨论】:
标签: cocos2d-x
谁能解释一下为什么我们需要在 Cocos2dx 中使用 CREATE_FUNC?我在 HelloWorld 示例中看到它并没有清楚地理解它。请告诉我更多细节。谢谢。
【问题讨论】:
标签: cocos2d-x
我们不需要使用它,它是一个辅助宏,扩展为:
/**
* 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() 函数中发生某些事情时,他们只需要更新它一处 - 宏定义。这减少了出错的空间,因为几乎没有机会“忘记”将代码更改为新版本的地方。
【讨论】:
在你的函数中定义 CREATE_FUNC 宏的更令人信服的原因(除了内存管理)是,如果不声明它,你的 init() 方法将永远不会被调用。(查看宏扩展中的这段代码 = > if (pRet && pRet->init()))
所以这实际上不仅仅是内存管理。您可以尝试将日志放入您的 init 方法并实际检查以验证这一点。
【讨论】:
CREAT_FUNC(ClassName) 只是一个帮助我们缩短代码的宏。
它包含默认的ClassName *create() 和bool init() 函数。
完成之后,你应该在你的ClassName.cpp 文件上实现bool ClassName::init()。
您可以显示定义的详细信息,然后您会发现。希望这会有所帮助。
【讨论】: