使用CCTMXTiledMap迭代cocos2d中的所有可用切片

时间:2013-05-29 13:36:36

标签: ios objective-c cocos2d-iphone

我正在使用CCTMXTiledMap类将地图加载到我正在制作的cocos2d游戏中。作为该过程的一部分,我想迭代与.tmx地图文件关联的切片集中所有可用切片的属性 - 包括当前未放置在图层上的切片。换句话说,我想知道与地图相关联的切片的最大GID。

我想做类似的事情:

for (int i = minGID; i < maxGID + 1; i++) { 
    ... do something with the tiles by calling their GID... 
}

如何确定与.tmx文件关联的minGID和maxGID?

2 个答案:

答案 0 :(得分:2)

试试这个:

int rowSize = self.mapSize.width/TILE_SIZE ;
int colSize = self.mapSize.height/TILE_SIZE ;

for(int i=0; i<rowSize;i++)
{
    for(int j=0; j<colSize; j++)
    {
        unsigned int tileGid = [self.meta tileGIDAt:ccp(i,j)];
        [[myMap propertiesforGID:tileGid] doSomethingCool];

        //
    }
}

答案 1 :(得分:2)

由于cocos2d每层仅限于一个tileset,因此每个tile图层实际上都有一个tileset引用:

CCTMXLayer* floorLayer = [tilemap layerNamed:@"floortiles"];
CCTMXTilesetInfo* tileset = floorLayer.tileset;
uint32_t firstGID = tileset.firstGID;

到目前为止,这么好。但是什么是最大GID?这可以为所有tileset获得,除了最后一个相当容易。假设你有两个具有不同tileset的tile图层,那么第二层的firstGID减一为前一层的maxGID。

对于最后一层,您可以假设maxGID是tileset中可能的tile数。但是,这并不能解释未完全填充实际切片的切片集。另一种选择是使用此tileset迭代所有图层并记录使用中的最高GID。这也是有缺陷的,因为具有最高GID的图块实际上可能不会被放置在地图上。

解决此问题的唯一明确解决方案是添加虚拟层并在0,0处向其添加最高GID,然后检查虚拟层上该位置的平铺GID。这就是你如何确定tileset的最高GID是多少。如果在此过程中没有人为错误,并且您记得在向tileset添加更多切片时更新切片。

以编程方式准确推断此信息的唯一其他方法是扫描纹理并排除所有未使用的图块,方法是检查每个图块区域并找到第一个完全透明或单个(特定)颜色的图块。这仅适用于您的图块集从左到右,从上到下填充,中间没有任何“空”图块。

我在KoboldTouch中使用的所有这些选项都只是假设具有最高firstGID值的tileset完全用tile填充,这意味着lastGID将是:

uint32_t lastGID = firstGID + (texWidth/tileWidth) * (texHeight/tileHeight) - 1;

这几乎适用于所有情况。