我目前正在使用Cocos2dx设计游戏。我希望使用callfuncND_selector函数为我的游戏开发一个带回调的API。我想要类似于HTTPRequest函数setCallBackFunction,它将函数作为指针
request->setResponseCallback(this,callfuncND_selector(MenuLayer::onHttpRequestCompleted));
有谁能告诉我怎么做到这一点?喜欢充实功能定义来帮助我吗?我是c ++的新手,非常感谢任何帮助。
亲切的问候
答案 0 :(得分:1)
我假设您在询问如何声明这样的功能?
一个例子,如果您确定目标回调选择器保留在内存中,如下所示:
在你的hpp:
class YourRequestClass
{
// ...
protected:
CCCallFuncND* stored_cb ;
void executeStoredCallback() ;
void releaseCallback() ;
public:
void setResponseCallback( CCCallFuncND* cb ) ;
// ...
}
在你的cpp:
void YourRequestClass::setResponseCallback( CCCallFuncND* cb )
{
// store cb for later use. You have to retain it for it to stick around.
if ( cb )
{
cb->retain() ;
stored_cb = cb ;
}
}
void YourRequestClass::executeStoredCallback()
{
if ( stored_cb ) stored_cb->execute() ;
}
void YourRequestClass::releaseCallback()
{
if ( stored_cb ) { stored_cb->release() ; stored_cb = NULL ; }
}
从“请求”实例调用您的函数,并且“this”是回调方法的所有者实例:
request->setResponseCallback( cocos2d::CCCallFuncND::create( this, (cocos2d::SEL_CallFuncND) &yourcbclassname::your_cb_method, (void*)ptr_to_some_data ) ) ;
这将向您展示如何宣布cocos2d cb参数。需要注意的是,如果cb对象实例不能保证在内存中保留,那么这种方法就不合适了,否则你最终会玩悬空指针。
如果您的目标是通用API而不是特定项目的特定案例,那么您需要另一种方法来处理保留(例如,smartptr和您自己的仿函数系统)。
希望这有帮助。