将参数发送到CCCallFuncND ::创建Cocos2d-X

时间:2013-12-04 10:58:26

标签: cocos2d-x

我的Cocos2d-X应用程序中有以下代码

void SampleRequest::setResponseCallback(CCCallFuncND* cb){
    if(cb){
        cb->retain();
        stored_cb=cb;
    }
}


void SampleRequest::executeStoredCallback(){
    if(stored_cb)
        stored_cb->execute();
}

void SampleRequest::releaseCallback(){
    if(stored_cb){
        stored_cb->release();
        stored_cb=NULL;
    }
}

和一个简单的课程

void RequestHandler::handleSampleRequest(int data){
    CCLog("--------------------------------------------> Its here for me to do %d",data);
}

和另一个代码的和平

    int i=10;
    SampleRequest *t=new SampleRequest();
    t->setResponseCallback(
                CCCallFuncND::create(
                this,
                callfuncND_selector(RequestHandler::handleSampleRequest),
                (void*)&i));

但是我收到的值是0.如何将I的值发送回回调函数,以及如何向该函数发送多个参数。

亲切的问候,

2 个答案:

答案 0 :(得分:1)

int i=10;

您是在堆栈上声明我是临时变量,而不是在堆上,还是作为请求对象实例数据? 如果是这样,当你创建它的块退出时(变量范围结束),你的i变量将被销毁。

这可以解释为什么回调会收到一个指向未定义内存的值,该值在调用时已被破坏。

尝试使用new运算符,或将i值存储在请求对象中,直到进行cb调用。

  

如何向此功能发送多个参数

你不会;只需将指针传递给结构或对象即可。如果您的所有存储数据都在“请求”实例中,您也可以传递实例本身。

例如,再次假设传递给回调的数据在调用回调函数时将保留在内存中(即下面的“RequestData”实例):

    struct RequestData
    {
      int value1 ;
      int value2 ;
      // ....
    } ;

   class RequestHandler: public cocos2d::CCObject
    {
       // ...
       public: 
         void requestCallback( CCNode* sender, void* pData ) ;
    }

在您的实施中:

RequestHandler::requestCallback( CCNode* sender, void* pData ) 
{
   RequestData* pRequestData = static_cast<RequestData*>( pData ) ;

  if ( pRequestData )
  {
     // do something ...
  }
}

要构建您的调用,构建一个RequestData实例,其中包含您需要传递给回调的所有数据,请确保它在堆上分配“new”或另一个对象的一部分(例如,在队列中)这样在调用回调时它的数据在内存中仍然有效。我在这一点上坚持一点,因为你需要某种数据存储机制作为你设计的一部分,否则你的回调可能会发现自己在内存中处理无效地址(悬空指针)。

基本上,来自您之前的代码:

RequestData* pRequestData = new RequestData();
// fill in the structure data here...

SampleRequest *t=new SampleRequest();
t->setResponseCallback(
            CCCallFuncND::create(
            this,
            callfuncND_selector(RequestHandler::requestCallback),
            (void*)pRequestData));

答案 1 :(得分:0)

//像这样使用

void* data = (int*) 10; 
int value = *((int*) &data);