任何人都可以解释我为什么需要在Cocos2dx中使用CREATE_FUNC?我在HelloWorld示例中看到了它并且不清楚它。请告诉我更多细节。感谢。
答案 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
。
你可以显示定义的细节,然后你会发现。希望这会有所帮助。