一個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的問題查了。
以上很多可以做字符替換方式。