求翻译一句代码,从cocos2d-x-2.x到3.2

从网上下了一个游戏源码,但是源码是基于cocos2d-x-2.2的,但是我电脑上装的是cocos2d-x-3.2,怎么改都编译不过,求翻译。

2.2版本的代码如下:
CCCallFuncND* call = CCCallFuncND::create(this,
callfuncND_selector(SceneGame::moveComplete),
(void*)(intptr_t)killId); // 求翻译此句

moveComplete的原型为:void SceneGame::moveComplete(Node* movestone, void* _killid)

我尝试修改为: auto call = CallFuncN::create(CC_CALLBACK_2(SceneGame::moveComplete, this));,但是编译出错,而且我也不知道如何才能将killId这个变量传递给moveComplete,请大家帮忙

我用了auto call = __CCCallFuncND::create(this, callfuncND_selector(SceneGame::moveComplete), (void*)killId);编译通过了,但是有一句警告,说create方法被deprecated,有什么替代方法吗?
其实这句与原谅2.2的用法是一样的。

有没有一种写法是适用于3.2且没有任何警告的呢?

:14:可以 用std::bind 呀

用std::bind 还是太麻烦了吧。。。 直接不理警告。。

我用了这样的写法:auto call = CallFuncN::create(std::bind(&SceneGame::moveComplete, this, std::placeholders::_1, (void*)killId));
编译通过了,也没有警告了,程序跑起来也没有出错,那是不是可以说,我这句代码的修改,完全成功了呢?

:12: 能通过就行了。

谢谢关注,早上又去搜索了下自带的示例程序,发现有现成的例子(原来自己看漏了,呵呵)。
示例文件名:ActionsTest.cpp,部分代码摘录如下:

void ActionCallFuncND::onEnter()
{
    ActionsDemo::onEnter();

    centerSprites(1);

    auto action = Sequence::create(
        MoveBy::create(2.0f, Vec2(200,0)),
        CallFuncN::create( CC_CALLBACK_1(ActionCallFuncND::doRemoveFromParentAndCleanup, this, true)),
        nullptr);

    _grossini->runAction(action);
}

void ActionCallFuncND::doRemoveFromParentAndCleanup(Node* sender, bool cleanup)
{
    _grossini->removeFromParentAndCleanup(cleanup);
}


```


其中,doRemoveFromParentAndCleanup就是带了两个参数的回调函数。

那么,问题又来了,既然CallFuncND可以用CallFuncN来取代,CC_CALLBACK_1也可以用来表示带2个参数的回调函数,那么CC_CALLBACK_2岂不是也完全用不到了,直接用CC_CALLBACK_1就好了?

我又发现CC_CALLBACK_0也可以表达CC_CALLBACK_1,示例代码如下:
void ActionCallFuncO::onEnter()
{
ActionsDemo::onEnter();

centerSprites(1);

auto action = Sequence::create(
    MoveBy::create(2.0f, Vec2(200,0)),
    CallFunc::create( CC_CALLBACK_0(ActionCallFuncO::callback, this, _grossini, true)),
    nullptr);
_grossini->runAction(action);

}

std::string ActionCallFuncO::title() const
{
return “CallFuncO + autoremove”;
}

std::string ActionCallFuncO::subtitle() const
{
return “simulates CallFuncO with std::bind()”;
}

void ActionCallFuncO::callback(Node* node, bool cleanup)
{
node->removeFromParentAndCleanup(cleanup);
}

真的有点乱了!

CC_CALLBACK_X系列实际上是std::bind。区别在于占位符的个数,只是用于提供方便而已,不仅仅只是提供给引擎使用,你自己的其他代码也都可以用。

CallFuncX系列其实CallFunc也都可以实现。之前和子龙山人验证过,也在论坛发贴了(http://discuss.cocos2d-x.org/t/do-we-really-need-callfuncn-class/18782)。

Riq说是兼容以前的版本,可能会在4.x弃用。

占位符个数不对也能正确绑定,绑定后也能正确识别参数个数和顺序么。。

版主大人研究的透彻呀,我看了代码后也有这种感觉,确实CallFunc就可以实现CallFuncX系列的功能,而且CallFuncX::create有被deprecated的迹象(趋势)。

以后清理干净后,就不会再这样被搞迷糊了!

你说的“为了兼容以前的版本”,这个说法我非常理解,明白!

这里同样提到了“CallFuncN should be deprecated in v4.0”

http://discuss.cocos2d-x.org/t/do-we-really-need-callfuncn-class/18782

— Begin quote from ____

引用第11楼zhouciming于2014-12-29 10:21发表的 :
这里同样提到了“CallFuncN should be deprecated in v4.0”

http://discuss.cocos2d-x.org/t/do-we-really-need-callfuncn-class/18782 http://www.cocoachina.com/bbs/job.php?action=topost&tid=278880&pid=1208892

— End quote

原来我看的就是“版主大人们之前讨论的帖子“呀,惭愧惭愧!

:8:
3.3 直接跳到4.X… 跳的也太快了吧:2:

还有个3.4。