由于 cocos2d 被限制为每层一个tileset,每个tile layer实际上都有一个tileset引用:
CCTMXLayer* floorLayer = [tilemap layerNamed:@"floortiles"];
CCTMXTilesetInfo* tileset = floorLayer.tileset;
uint32_t firstGID = tileset.firstGID;
到目前为止,一切都很好。但是最大 GID 是多少?这可以很容易地为除了最后一个之外的所有图块集获得。假设您有两个具有不同瓦片集的瓦片层,那么第二层的 firstGID 减去一个就是前一层的 maxGID。
对于最后一层,您可以假设 maxGID 是图块集中可能的图块数。然而,这并没有考虑到没有完全填充实际瓦片的瓦片集。另一种选择是使用此图块集遍历所有层并记录使用中的最高 GID。同样,这是有缺陷的,因为具有最高 GID 的图块实际上可能并未放置在地图上。
解决此问题的唯一明确解决方案是添加一个虚拟层并将最高 GID 添加到 0,0 处,然后检查虚拟层上该位置的平铺 GID。这样您就可以确定瓦片集的最高 GID 是多少。前提是在此过程中没有人为错误,并且如果您将更多图块添加到图块集中,请记住更新图块。
以编程方式准确推断此信息的唯一另一种方法是扫描纹理并排除所有未使用的图块,方法是检查每个图块区域并找到第一个完全透明或单一(特定)颜色的图块。这仅在您的图块集从左到右、从上到下填充且中间没有任何“空”图块时才有效。
从所有这些选项中,我在KoboldTouch中使用的选项是简单地假设具有最高 firstGID 值的图块集完全由图块填充,这意味着 lastGID 将是:
uint32_t lastGID = firstGID + (texWidth/tileWidth) * (texHeight/tileHeight) - 1;
这对于几乎所有情况都足够了。