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

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


谁能告诉我我该怎么做?喜欢充实功能定义对我有帮助吗?我是C ++的新手,将不胜感激。

亲切的问候

最佳答案

我假设您在问如何声明这样的功能?

一个示例,如果您确定目标回调选择器保留在内存中,如下所示:

在您的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和您自己的函子系统)。

希望这可以帮助。

关于c++ - 在Cocos2d-X中使用callfuncND_selector创建回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20348835/

10-11 04:02
查看更多