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

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

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

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.  CC的类库如果发现不能用的,去掉CC前缀即可。

15. kCCScrollViewDirectionHorizontal 枚举的 改成ScrollView::Direction::HORIZONTAL 等

16. numberOfCellsInTableView 重写按要求返回ssize_t 即可

17. draw() 无法被重写,改成virtual void draw(Renderer *renderer, const Mat4& transform, uint32_t flags) override;

18. CCARRAY_FOREACH(pCCMenu->getChildren(), pTempCCObj) 之类改成 for (const auto& pObject : pCCMenu->getChildren()) ,因为已经改用模板Vector<Node*>方式了.

19. 部分地方的getString() 改为 getString().c_str()。

20. tableCellAtIndex(cocos2d::extension::TableView *table, unsigned int idx)  改成 tableCellAtIndex(cocos2d::extension::TableView *table, ssize_t idx) 

21. 如果你的NODE在2.2.6同样的节点有remove和addchild的操作,要注意了,2.2.6有些是及时释放的,3.16没有,而2.2.6有些是没有及时释放的,而3.16则释放了,总之3.16的检测机制更完善了。

22. 遇到pthread问题的,可以转std::thread,不想转的话,copy 2.2.6的phread.h头文件过来,还有pthreadVCE2.dll和pthreadVCE2.lib即可。

 

 

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

 

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

 

posted on 2018-02-01 14:49  breeze  阅读(1739)  评论(0编辑  收藏  举报