2

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

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

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

这是代码:

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

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

4

2 回答 2

2

在运行一系列动作之后,我必须做同样的事情:我想从 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);
    }

请让我知道这是否符合您的目的。

于 2013-12-02T17:52:23.757 回答
1

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

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

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

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

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

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

于 2013-11-21T06:23:56.747 回答