当你创建TMXTiledMap* tilemap=TMXTiledMap::create("test1.tmx")或Sprite *sprite=Sprite("HelloWorld.p-ng"),有没有产生这样的疑问--为什么把资源test1.tmx和HelloWorld.png放在项目目录下的Resources文件中即可直接引用而不用标明具体路径,并且可以在多个平台下引用?或许很多人就会这样说:“别人告诉我放在这个文件夹中就可以了,我自己使用确实可行,也没有出错,我就没有多去探究了”。如果你想知道这具体原因,就要阅读下面的分析了。如果你并不关心其原因,你可以关闭这个网页了。
我以TMXTiledMap::Create函数为讲解对象。
首先转到TMXTiledMap::Create的定义中,其定义是在CCFastTMXTiledMap.cpp文件中,代码1如下。其目录是E:\mycoscos2d\test2\cocos2d\cocos\2d中,这就说明这是与具体平台无关的,后面我们会看到已具体平台相关的代码。
代码1:
在代码1中,我们可以看到先创建一个TMXTileMap对象,然后初始化,最后加入自动释放池。如果想了解cosco2d-x3.2内存的管理,请继续关注我的博客。在这里我们也完全没有看到关于路径相关的字符串。其中让人觉得,路径设置有可能在TMXTiledMap()::initWithTMXFile()中,于是我们继续转到TMXTiledMap()::initWithTMXFile()定义中。代码2如下。
代码2:
代码1:
- <spanstyle="font-size:18px;">TMXTiledMap*TMXTiledMap::create(conststd::string&tmxFile)
- {
- TMXTiledMap*ret=newTMXTiledMap();
- if(ret->initWithTMXFile(tmxFile))
- {
- ret->autorelease();
- returnret;
- }
- CC_SAFE_DELETE(ret);
- returnnullptr;
- }</span>
代码2:
copy
- <spanstyle="font-size:18px;">boolTMXTiledMap::initWithTMXFile( CCASSERT(tmxFile.size()>0,"FastTMXTiledMap:tmxfileshouldnotbeempty");
- setContentSize(Size::ZERO);
- TMXMapInfo*mapInfo=TMXMapInfo::create(tmxFile);
- if (!mapInfo)
- returnfalse;
- }
- CCASSERT(!mapInfo->getTilesets().empty(),"FastTMXTiledMap:Mapnotfound.Pleasecheckthefilename.");
- buildWithMapInfo(mapInfo);
- true;
- }</span>