【问题标题】:Sending Paramters to a CCCallFuncND::create Cocos2d-X向 CCCallFuncND::create Cocos2d-X 发送参数
【发布时间】:2013-12-08 03:08:35
【问题描述】:

我的 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。如何将我的值发送回回调函数,以及如何向该函数发送多个参数。

亲切的问候,

【问题讨论】:

    标签: cocos2d-x


    【解决方案1】:
    int i=10;
    

    您是将 i 声明为堆栈上的临时变量,而不是堆上的临时变量,还是请求对象实例数据? 如果是这样,当创建它的块退出(变量范围结束)时,您的 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 实例,其中包含您需要传递给回调的所有数据,确保它在堆上分配有“新”或另一个对象的一部分(例如,在队列中)以便在调用回调时其数据在内存中仍然有效。我坚持这一点,因为您需要某种数据存储机制作为设计的一部分,否则您的回调可能会发现自己处理内存中的无效地址(悬空指针)。

    基本上,从您之前的代码:

    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));
    

    【讨论】:

    • 你能给我一个发送对象作为参数的例子吗?
    【解决方案2】:

    // 像这样使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多