在Cocos2d TMXTiledMap中使用Tileset图像属性

时间:2013-02-12 23:48:41

标签: ios cocos2d-iphone

我正在开发一款使用Cocos2d TMXTiledMap来阅读Tiled应用程序中生成的等距地图的iOS游戏。

在Tiled中,您可以为图块集中的每个图像添加属性(即显示在屏幕右下角的图像)

使用这些属性来帮助确定游戏角色是否可以遍历此拼贴类型是有意义的。

例如,如果图块3,5使用的是草图,则陆基角色可以在那里行走。

相反,如果牌4,8使用水的图像,那么陆基角色就不能走在那里。

我曾希望通过在称为terrain_type的草地和水瓦片上创建一个属性来实现这一目标,该属性为0,陆地为1,水为1。然后(我曾希望)我可以在运行时访问tile 3,5并以某种方式知道tile 3,5使用了草图像,其属性为terrain_type=0

现在,我意识到还有其他技术可以完成同样的事情(想象一下Object Layer),但这似乎是最好的方法。特别是当您添加多个切片图层并且您想要知道瓷砖3,5上有草和墙时。

我的问题:这可能吗?我该怎么做呢。或者,我是否误解了Tiled和TMXTiledMap应该如何工作?

非常感谢...

1 个答案:

答案 0 :(得分:2)

惊人。在我发布问题之前,我花了很多时间试图让它工作,当然,几个小时之后,我想出来了。关键是使用CCTMXMapInfo类。

无论如何,这是解决方案,因为我认为这可能对其他人有用:

  1. 在Tiled应用程序中,创建一个名为tile图层的地图 “bottom”
  2. 在名为的部分中为每个图块图像添加属性 通过右键单击每个图像来“Tilesets”(右下角) 选择“Tile Properties”
  3. 将属性命名为“terrain_type”并将值设置为您喜欢的任何值(例如,land_type = 0表示land或terrain_type = 1表示水)
  4. 使用这些图像绘制瓷砖地图并保存
  5. 使用此代码读取位于3,5:

    的单个图块的属性
    //read the tile map
    TMXTiledMap *tileMap = [CCTMXTiledMap tiledMapWithTMXFile:@"sample_map.tmx"];
    
    //get the bottom layer from the tileMap
    CCTMXLayer *bottomLayer = [tileMap layerNamed:@"bottom"];
    
    //get CCTMXMapInfo object -- TMXTiledMap DOES NOT Contain the tile image properties
    CCTMXMapInfo * mapInfo = [CCTMXMapInfo formatWithTMXFile: @"sample_map.tmx"];
    
    //get tile id of the tile image used at this coordinate (3, 5) in this layer
    int tileID = [bottomLayer tileGIDAt: ccp(3, 5)];
    
    //get the properties for that tile image
    NSDictionary *properties = [mapInfo.tileProperties objectForKey:[NSNumber numberWithInt:tileID] ];
    
    //get the terrain_type property
    NSString *terrainType = [properties objectForKey:@"terrain_type"];