unsigned long len = 0;
char* pBuffer = (char*)CCFileUtils::sharedFileUtils()->getFileData("map.tmx", "rt", &len);
CCTMXTiledMap* cme=CCTMXTiledMap::createWithXML(pBuffer,NULL);
用这种方法创建tmx地图可能会失败,跟踪调试进取看到,在解析xml中
int result = xmlSAXUserParseMemory( &saxHandler, this, pXMLData, uDataLength );(在bool CCSAXParser::parse(const char* pXMLData, unsigned int uDataLength)这个函数中)
uDataLength 长度跟最初len上面的不一样,uDataLength 是使用strlen获取pBuffer的长度
bool CCTMXMapInfo::parseXMLString(const char *xmlString)
{
int len = strlen(xmlString);
if (xmlString == NULL || len <= 0)
{
return false;
}
CCSAXParser parser;
if (false == parser.init("UTF-8") )
{
return false;
}
parser.setDelegator(this);
return parser.parse(xmlString, len);
}
CCFileUtils::sharedFileUtils()->getFileData是使用fread获取pBuffer的长度.
VS调试查看内存,看到
如上图,fread是以EOF为标志结束的,即0x0a,而strlen是以00为结束位的.所以造成内存不一样.本来在0a处就停止,但strlen会直到00才会结束.
只要加上
pBuffer[len-1]=0;
就可以上strlen正确读取长度
cocos2d-x的版本是cocos2d-2.1beta3-x-2.1.1