【问题标题】:cocos2dx. how to set a callback (passing an argument) after sequence of animationscocos2dx。如何在动画序列之后设置回调(传递参数)
【发布时间】:2013-11-14 23:12:19
【问题描述】:

我试图在一系列动画之后设置一个动作,基本上我需要为一个方法使用一个对象(我想作为参数传递)。

我发现的唯一方法是使用 CCCallFunc,它(据我所知)不应该有参数。

是否存在 cocos2d/objective-c 的一种“callBlock”?这是一个很棒的工具,我想知道是否有与cocos2d-x类似的东西

代码如下:

CCCallFuncND *callBack = CCCallFuncND::create(this, callfuncND_selector(MyObject::method), data);

因为我试图在一个只有静态函数的类(未初始化)中执行此操作,所以我不能使用“this”,所以我尝试将其设置为 NULL,但在这种情况下我遇到了一个错误......

【问题讨论】:

  • 没有CCCallFuncND吗?
  • 是的,我试过了,但我没有找到如何在其中传递参数,我收到此错误:“无法从类型 void()(MyObject) 转换为成员指针类型 SEL_CallFunND" (aka void(cocos2d::CCObject::*)(cocos2d::CCnode*, VOID*));
  • 您可以发布您用于 CCCallFuncND 的实际代码吗?您可能只是错误地投射/传递了“数据”对象。
  • 我已经编辑了代码,正如我所说我试图使用静态函数并使用参数调用另一个静态函数,现在我刚刚更改了代码以获取对象(所以我传递对象而不是“this”)现在正在工作,但我想知道如何直接从 cccallfunc 中未创建的类传递静态函数

标签: c++ callback arguments cocos2d-x


【解决方案1】:

在运行一系列动作之后,我必须做同样的事情:我想从 bacthNode 中删除精灵,这样我的动画帧就不会在动画结束时出现在屏幕上,所以我必须将批处理节点传递给功能,这就是我实现它的方式:-

CCSequence *seq=CCSequence::createWithTwoActions(
    CCAnimate::create(animation), 
    CCCallFuncO::create(
        animation, 
        callfuncO_selector(GameLayer::animationReshuffleFinished),
        (CCObject*)animBatchNode)
);

你需要的函数是CCCallFuncO而不是ND这里O代表Object。

CCCallFuncO::create(
    animation,
    callfuncO_selector(GameLayer::animationReshuffleFinished),
    (CCObject*)animBatchNode)

animation 是我的 CCAnimate 对象 animationReshuffleFinished 是我的类 GameLayer 的回调函数,我想在动画结束时调用它。 (CCObject*)animBatchNode) 是函数 animationReshuffleFinished 的参数

这里是函数的定义

 void GameLayer::animationReshuffleFinished(CCObject *sender){
    CCSpriteBatchNode *animBatchNode = (CCSpriteBatchNode*) sender;
    animBatchNode->cocos2d::CCNode::removeAllChildrenWithCleanup(true);
    }

如果这符合您的目的,请告诉我。

【讨论】:

    【解决方案2】:

    你就是不能。如果你检查SEL_CallFuncXXX的定义,你会发现函数必须是CCObject的成员函数。

    当前的 cocos2d-x 回调完全是从 cocos2d 复制的,但是 Objective-C 的方式不适合 C++。限制是:

    1,如果您传递具有多个基类的对象,可能无法正常工作。

    2、不能传递分配在栈上的参数如XXX::f(bool),不能传递bool。

    3,正如你所提到的,回调函数必须是从CCObject派生的类的成员函数。所以静态函数或全局函数不能使用

    可能你很好奇他们为什么不使用 std::function & std::bind 来代替,好吧,可能他们复制 cocos2d 太快了,没有时间考虑。

    【讨论】:

    • +1 "也许你很好奇他们为什么不使用 std::function & std::bind 来代替,嗯,可能是他们复制 cocos2d 太快了,没有时间考虑。”我的想法完全正确。
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2022-01-12
    • 2019-01-07
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多