cocos2dx 从2.2.6 到3.16 升级流水记录

时间:2021-03-30 20:55:03

一个cocos2dx项目从2.2.6 升级至3.16 的过程,由于没有直升工具,类库升级也变动很大,有一部分需要手工完工升级。此记录供参考

1、 没有采用项目直升方式,先新建一个3.16的项目,然后把c++文件逐步转过来,不要项目直升,编译的错误会直接让你头昏,而害怕止步,首先转公共类库部分。

2、3.16的项目的字符集是 Unicode 字符集,改成多字节符集,如果你里面有大量的char操作,就建议改,不要改项目里面的函数,这里一步到位。

cocos2dx 从2.2.6 到3.16 升级流水记录

3.  keyBackClicked 方法,改成onkeyBackClicked,3.16的不重写了。

改成

virtual void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event) override;
virtual void onkeyBackClicked();

cpp里面改成

void 你的类名::onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event){
  基类名称::onKeyReleased(keyCode, event);
  if (keyCode == EventKeyboard::KeyCode::KEY_BACKSPACE)
  {
    onkeyBackClicked();
  }
}
void CGameClientView_DZ::onkeyBackClicked()
{  。。。 }

4. ccTouchBegan,ccTouchMoved,ccTouchEnded 改成onTouchBegan,onTouchMoved,onTouchEnded ,这部相对简单,但是每个都得改。。。

5. removeFromParentAndCleanup后访问对象带来的内存错误,在对象初始化完成后加CC_SAFE_RETAIN,销毁前再CC_SAFE_RELEASE就好了。

6. CCControlEvent 改成 Control::EventType,这个不是绝对,看调用的对象,如果是Widget 那就用Widget里面的。

7. registerWithTouchDispatcher 去掉,默认layer在3.16已经自己支持Touch,在对象的init方法中加 setTouchMode(cocos2d::Touch::DispatchMode::ONE_BY_ONE);  调用setTouchEnabled(true);不变,就会自动进入onTouchBegan了

8. CCMenuItemSprite::create 说参数不符的地方,例如

CCMenuItemSprite::create(CCSprite::createWithSpriteFrameName("xxx.png"),CCSprite::createWithSpriteFrameName("xxx_SEL.png"), this, menu_selector(CGameClientView_DZ::backCallback));

改成:CC_CALLBACK_1(CGameClientView_DZ::backCallback, this) 。

这个要更改的地方多。

9. CCControlEventValueChanged 改成 Control::EventType::VALUE_CHANGED

10. setTouchPriority 可以去掉,目前3.16按层次传递事件,你看实际情况改代码设置优先级,已经不采用setTouchPriority 这种方式。很多地方可以直接去掉,对话框的话用有对话框的方式,不是setTouchPriority .

11. callfuncN_selector 转换无效的话,改成CC_CALLBACK_0,例如:

CCCallFuncN::create(PlayVoice,callfuncN_selector(CCSprite::removeFromParent))

改成 CallFuncN::create(CC_CALLBACK_0(CCSprite::removeFromParent, PlayVoice))

12. CCLog 通不过的话,用CCLOG

13. CCPointZero , ccWhite 等常量值编译不同过的话,改成 Vec2() , Color3B::WHITE等。

14.  未完待续

目前项目大部分已经转换完成,可以运行了,少量的还在修改,效果还行,不用整天找2.2.6的问题查了。

以上很多可以做字符替换方式。