coco2dx3.3 的两个“bug”: 1.所有ttf文字都不显示,或者乱码,排除字符集错误;2.无法在xp上运行
一:ttf不显示的bug,难搞,一点头绪都没有,只知道别人电脑上能显示,到我这就不行了。其实迅雷的客户端在我的电脑上显示的也不正常。后来发现居然是桌面设置的问题,之前设置的16位,实际上设置32位真彩图就一点问题也没有了。
网上找了下,按照下面的修改,即时设置是16位也能正常了。
一句话描述就是:cocos2dx使用的是32位的帧缓存,创建bitmap的时候使用的dc不是,创建dib的时候也没有设置32位,所以就乱码了。
网上找了下,按照下面的修改,即时设置是16位也能正常了。
一句话描述就是:cocos2dx使用的是32位的帧缓存,创建bitmap的时候使用的dc不是,创建dib的时候也没有设置32位,所以就乱码了。
修改 win32/ccimage.cpp 文件
1.
m_hBmp = CreateBitmap(nWidth, nHeight, 1, 32, NULL);
改成 :
m_hBmp = CreateCompatibleBitmap(m_hDC, nWidth, nHeight);
2.
填加
bi.bmiHeader.biBitCount = 32;
在下面这句话之前
GetDIBits(dc.getDC(), dc.getBitmap(), 0, m_nHeight, m_pData, (LPBITMAPINFO)&bi, DIB_RGB_COLORS);
完美解决
二:无法在xp上运行,现象是先提示什么 无法定位GetTickCount64于Kernel32.dll,然后又无法定位inet_ntop于Kernel32.dll起初怀疑是控制帧率或者定时器的时候使用了GetTickCount64,后来看了下,用的是多媒体高精度定时器那一套,然后有尝试使用windbg下api断点,也没断到。
在然后老老实实一个dll 一个dll的去看导入函数列表,后来发现是libwebsocket.dll使用了GetTickCount64,从官网重新搞一个回来自己编译。
接下来提示inet_ntop了,思维局限倒是我还以为是在websocket上除了问题,但是实际上最后找到的是在libcocos2dx里边用到了这个函数,所以,还是要有全局意识,不能自己钻到角落里边去了,盯着一个点不放。if (!WSAAddressToStringA((struct sockaddr*)&sin->sin6_addr, sizeof(sin->sin6_addr), 0, buf, &nLen))
cocos2d::log("Console: listening on %s : %d", buf, ntohs(sin->sin6_port));
//if( inet_ntop(res->ai_family, &sin->sin6_addr, buf, sizeof(buf)) != nullptr )
// cocos2d::log("Console: listening on %s : %d", buf, ntohs(sin->sin6_port));