当你创建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)@H_301_37@
- {@H_301_37@
- TMXTiledMap*ret=newTMXTiledMap();@H_301_37@
- if(ret->initWithTMXFile(tmxFile))@H_301_37@
- {@H_301_37@
- ret->autorelease();@H_301_37@
- returnret;@H_301_37@
- }@H_301_37@
- CC_SAFE_DELETE(ret);@H_301_37@
- returnnullptr;@H_301_37@
- }</span>@H_301_37@
代码2:
copy
- <spanstyle="font-size:18px;">boolTMXTiledMap::initWithTMXFile( CCASSERT(tmxFile.size()>0,"FastTMXTiledMap:tmxfileshouldnotbeempty");@H_301_37@
- setContentSize(Size::ZERO);@H_301_37@
- TMXMapInfo*mapInfo=TMXMapInfo::create(tmxFile);@H_301_37@
- if (!mapInfo)@H_301_37@
- returnfalse;@H_301_37@
- }@H_301_37@
- CCASSERT(!mapInfo->getTilesets().empty(),"FastTMXTiledMap:Mapnotfound.Pleasecheckthefilename.");@H_301_37@
- buildWithMapInfo(mapInfo);@H_301_37@
- true;@H_301_37@
- }</span>@H_301_37@