使用Cocos2d-X中的callfuncND_selector创建回调

时间:2013-12-03 10:39:59

标签: c++ cocos2d-x

我目前正在使用Cocos2dx设计游戏。我希望使用callfuncND_selector函数为我的游戏开发一个带回调的API。我想要类似于HTTPRequest函数setCallBackFunction,它将函数作为指针

request->setResponseCallback(this,callfuncND_selector(MenuLayer::onHttpRequestCompleted)); 

有谁能告诉我怎么做到这一点?喜欢充实功能定义来帮助我吗?我是c ++的新手,非常感谢任何帮助。

亲切的问候

1 个答案:

答案 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和您自己的仿函数系统)。

希望这有帮助。