如何用cocos2d—x和js区别-x来做一个基于TileMap地图块的游戏

接上一章《cocos2d—x和js区别-x源代码解析(1)——地图模块(2)》

当中CCTMXMapInfo存储地图的信息包扩下面几块信息:

接下来我们分析cocos怎样通过这些信息,生成地图的图像:

这个函数首相將地图信息赋给map类接下来对于每一个layer进行处理,重要的函数是parseLayer这个函数是将layer的信息处理好而且加上sprite,并生成CTMXlayer对象

尽管有一大堆的属性和函数,可是归根结底他是一个CCSpriteBatchNode对象因为地图中非常多图片是同样的。CCSpriteBatchNode就是cocos2d—x和js区别-x为了减少渲染批次而建立的一个专门管理精灵的類

第二步是依据layerInfo创建一个真正的层信息。

第三步是将tiled增加到这个层中去

要在cocos2d—x和js区别-x中使用TMX格式的瓷砖哋图首先必须把TMX文件和它所引用的瓷砖集图片文件作为资源添加到自己项目中。 在本例子中  我们将level1.tmx和tileSet.png加入到我们的项目中   

CCTMXTiledMap类是用TMX文件名來初始化的然后作为子节点被添加到当前层中

下一步是通过使用tileMap的layerNamed方法和在Tiled中应用过的层命名"walls",来获取CCTMXLayer(也就是之前在Tiled中添加的游戏事件层)我们通过第四行  可以将地图中的砖块层隐藏掉

好了   运行程序 我们可以在手机上看到  地图已经显示了  但是你还不能去操作

接下来 我們需要判断  是否按中了问号方块

我们先将按下的坐标  转换为tmx地图的坐标

转换后的坐标就类似于   如图

首先 我们来解释下上面的代码

6行:获取按下的坐标点 并转换为以左下角为原点的坐标;

8行:将按下的坐标 转换为tmx坐标地图

11行:用于存储是否按到了问号砖块

14行:获取按下坐标所对應的瓷砖的gid (利用CCTMXLayer的tileGIDAt方法,你可以获取指定坐标上瓷砖的GID编号)

如果你需要在地图上修改单个瓷砖,你可以使用removeTileAt和setTileGID这两个方法在游戏过程Φ,前者会移除指定层上的瓷砖后者则会替换指定层上瓷砖:


上篇我们完成了地图的信息获取囷碰撞检测这篇我们整合到程序中。

在这之前我们改造一下Tank类使它更加模块化,共容易理解:

1.改造后的Tank类声明如下:

 

可以看到这两个函数后面都多了TileMapInfo类的指针
我们可以在坦克中使用这个指针来检测是否碰撞。
 
上面函数中我们先把Tank类自己加入了地图层中,这样更方便峩们进行一个位置计算
然后缩放到了比地图上一整个砖块小一点的大小,这样可以正常通过砖块之间的通道
 
可以看到我们添加了plist文件,然后从中加载了tankTypeName类型的Tank精灵然后初始化,最后加入自动释放列表
 
可以看到我们跟之前的Tank类的command函数中多了碰撞检测,
先通过boundingBox获取Tank在地圖中的矩形然后传入移动后的矩形,

如果碰撞则不移动如果没有碰撞则按照stepX和stepY分量进行移动位置。
 
可以看到我们先初始化了地图信息然后通过地图信息创建了一个坦克,并把坦克放到了地图中的初始化位置
下面我们看看运行后的碰撞效果:



我要回帖

更多关于 cocos2d—x和js区别 的文章

 

随机推荐