• cocos2dx 从2.2.6 到3.16 升级流水记录


    一个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的问题查了。

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

  • 相关阅读:
    Vue 使用百度地图 实现搜索 定位
    VUE npm run dev 启动时,报了一大堆错误 Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 7.x
    git 更换push 提交地址
    vue 拖拽框架 draggable
    VUE axios请求 封装 get post Http
    关于git 远程仓库账户密码错误的问题
    输入交互(一)
    8.实战交付一套dubbo微服务到k8s集群(1)之Zookeeper部署
    7.kubernetes集群版本升级
    6.kubernetes的GUI资源管理插件-dashboard
  • 原文地址:https://www.cnblogs.com/zhujiechang/p/cocos2dx.html
Copyright © 2020-2023  润新知