在Cocos2d-x中,瓦片地图实现的是TileMap方案,TileMap要求每个瓦片占据地图上一个四边形或六边形的区域。把不同的瓦片拼接在一起,就可以组成一个完整的地图了。我们需要使用许多较小的纹理来创建瓦片。通常来说,我们会把这些较小的纹理放入一张图片中,就像碎图纹理一样。这样做可以有效地提高绘图性能,同时也为引擎的管理带来了便利。因此,每个小瓦片都应该来自一张大的纹理图片。
TileMap地图支持3种不同的视图:正交视图(orthogonal view,瓦片水平垂直排列)、六边形视图(hexagonal view,六边形瓦片紧密连接)和等轴视图(isometric view,45度斜视排列)
TileMap中的层级关系和Cocos2d-x中的是类似的,地图可以包含多个不同的图层,每个图层内都放置瓦片,同层内的瓦片间平铺排列,而高一层的瓦片可以遮盖低一层的瓦片。与Cocos2d-x不同的是,TileMap的坐标系的原点位于左上角,以一个瓦片为单位,换句话说,左上角第一块瓦片的坐标为(0,0),而紧挨着它的右边的瓦片坐标就是(1,0)。
TileMap中的每一个瓦片拥有一个唯一的编号GID,用于在地图中查找某个瓦片。Cocos2d-x提供了一系列方法,可以从瓦片地图坐标获取对应瓦片的GID,同时还可以利用这些方法来判断某个坐标下是否存在瓦片。稍后我们会看到瓦片地图GID的应用。
Cocos2d-x为我们提供了CCTMXTileMap和CCTMXLayer两个类来处理瓦片地图。其中,CCTMXTileMap代表一个完整的瓦片地图,它负责地图文件的载入、管理以及呈现。与其他游戏元素相同,CCTMXTileMap也继承自CCNode,因此可像层一样把它添加到游戏场景中。CCTMXLayer代表一个瓦片地图中的图层,可以从图层对象获取图层信息,如某一点是否存在对象组或属性。CCTMXLayer隶属于CCTMXTileMap,因此通常不需要我们手动管理图层。
此外,CCTMXTileMap还提供了一些操作地图的图层或地图对象的方法,可以通过关键字获取层、对象组或属性,这也为我们操作地图提供了便利。
看下例子代码:
- CCTMXTiledMap*mymap=CCTMXTiledMap::create("MyTextMap.tmx");
- boolisingore=mymap->isIgnoreAnchorPointForPosition();
- mymap->setAnchorPoint(ccp(0.5f,0.5f));
- mymap->setPosition(ccp(winSize.width/2.0f,winSize.height/2.0f));
- this->addChild(mymap,10);