關於cocos2dx3.2返回鍵問題以及ansi轉utf8的問題,cocos2dx3.2utf8
- 轉載請註明出處:簾卷西風的專欄(http://blog.csdn.net/ljxfblog)
- 最近在學習的過程中重新整理了一下代碼,順便把cocos2dx從3.0升到了3.2。這裡記錄一下升級過程中的問題。
- 之所以只升到3.2是因為後面的版本使用了lua5.2,而我還是更喜歡用5.1,而且能繼續使用luajit,另外一個原因是因為cocosstudio,3.2後面的版本就匯出成csd格式了,我不是很喜歡這種改變,我還是喜歡直接匯出json檔案,在lua中載入(其實是不想改代碼啦。)。個人認為,cocosstudio正在放棄自己的優勢,轉而向unity3d靠攏,希望搞一個大而全的工具來開發遊戲,這是強制改變使用者做遊戲的方式。很多C/C++程式員之所以不喜歡unity3d就是因為覺得這不是在編程,而cocos2dx則完全是程式員喜歡的方式。好了,個人見解不吐槽了,下面就說這次遇到的兩個問題吧。
- 第一個是關於返回鍵的問題,最新編出來的的程式,在windows按退格鍵正常,但是在android發現按返回鍵沒有反應了。查了一些資料原來是響應的索引值改變了,3.0之前是具體看代碼,比較坑爹。
--註冊返回鍵function Layer:listenBackspace() if self._layer then local function onKeyReleased(keyCode, event) --3.0版本之前是KEY_BACKSPACE,3.1之後是KEY_BACK if keyCode == cc.KeyCode.KEY_BACK then self:onKeyCallback(keyCode) end end local listener = cc.EventListenerKeyboard:create() listener:registerScriptHandler(onKeyReleased, cc.Handler.EVENT_KEYBOARD_RELEASED) local eventDispatcher = self._layer:getEventDispatcher() eventDispatcher:addEventListenerWithSceneGraphPriority(listener, self._layer) endend
- 第二個問題是中文轉碼的問題,我之前有一篇博文介紹過。見關於cocos2dx中文轉UTF8碼的解決方案。最近在我的安卓4.4的手機上,發現轉碼失敗了,中文全部顯示一些框框。查了一些資料,原來是因為libicuuc.so庫檔案裡面的函數ucnv_convert_xx的版本變了,具體的版本映射如下:
//android2.1, ucnv_convert_3_8 //android2.2, ucnv_convert_4_2 //android2.3, ucnv_convert_44 //android4.0, ucnv_convert_46 //android4.0, ucnv_convert_46 //android4.1, ucnv_convert_47 //android4.2, ucnv_convert_48 //android4.3, ucnv_convert_50 //android4.4, ucnv_convert_51
- 知道問題後就好解決了,以後出現這個問題也有經驗了,在原文的基礎上稍微改一下即可。貼上我寫的新介面,這樣也方便以後擴充。
bool openIcuuc(){ void* libFile = dlopen("/system/lib/libicuuc.so", RTLD_LAZY); if (libFile) { char* dll_fx_list[] = { "ucnv_convert_3_8", "ucnv_convert_4_2", "ucnv_convert_44", "ucnv_convert_46", "ucnv_convert_47", "ucnv_convert_48", "ucnv_convert_50", "ucnv_convert_51", "ucnv_convert_52", "ucnv_convert_53" }; for (int i = 0; i < 10; ++i) { ucnv_convert = (void (*)(const char *, const char *, char * , int32_t , const char *, int32_t,int32_t*))dlsym(libFile, dll_fx_list[i]); if (ucnv_convert) return true; } dlclose(libFile); } return false;}