今年大三下半年,刚开始老师说要学习unity但是不知道为什么改为学习Cocos2dx。 这样我在寒假学的unity就不能在女生面前装逼了,很伤心。但是既来之则安之,好好学习cocos吧。
到目前为止,也是没有太过深入的理解过Cocos2dx【学习了差不多两个星期吧】。我感觉看别人对一个东西的理解总是不如自己去理解一下。最近在看关东生著的《Cocosdx实战c++》----其实感觉是有关cocos2dx的资料很少找了好久,最后选定这个作为自己的第一本Cocosdx启蒙书。
刚开始就是直接没有实战,就是过了一遍《cocos实战》--感觉这一遍的浏览是很有价值的,毕竟对自己将要着手的项目能够实现些什么东西、能够怎样的实现有了一个大体的框架。好吧,开始上自己最近学习的干货。
------------------------------------------------------------------------------------------------------------------------------------------------------------------
刚开始实现的是cocos2dx的一个TiledMap地图的加载,以及tiledmap数据的读取。
1.使用TiledMap--这个可以参考http://shahdza.blog.51cto.com/2410787/1613527
聊聊自己对Tiled Map的理解吧,首先TIledMap一个很实用的地图编辑软件--直接在官网上就能够下载,其次就是操作简单【虽然现在的喔连地形具体有什么作用都不知道】。具体一点的理解:创建一个新文件-》添加图块【图块就是自己的素材,会按照你规定的大小进行分割】-》命名图层【如果是初学者对层的概念不太了解,会有点难理解。那就干脆想,直接简单的创建两个图层--一个背景,一个对象层<在这里是没有考虑碰撞的东西>,在背景层里面绘制大体的场景,在对象层理添加一些对象<这个对象具体的我也不是很理解>】-》用自己的素材搭建好自己想要的场景后,保存【在这里需要注意的是有可能在你用cocos引用的时候发现一片黑--遇到这个问题第一个想到的就是打开自己保存的tmx文件--用记事本打开,打开后修改一下source的值为当前文件路径,然后就美滋滋了】。
2.在Cocos2dx里面打开tmx文件,显示场景。
这个只需要三步:1->在HelloWorld的头文件里面,申明一个TMXTiledMap 指针变量_tiledMap
2->在HelloWorld的cpp文件的init()里面给_tiledMap赋值【_tiledMap=TMXTiledMap::create("sourcename.tmx")】
3->像其他普通的元素一样addChild(_tiledMap) ,然后就好了。easy。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
在tiledMap里面对对象进行碰撞检测。
碰撞检测,就需要再给你的tmx文件重新建一个层--collidable,在这个层里面绘制碰撞检测的区域,完成后就开始代码编辑。-----
整理下碰撞检测的思路----首先你需要在TiledMap的tmx文件中添加一个碰撞检测层->然后给这个层做一下标记【设置该层的图块属性(属性名+属性值)在这里我还把碰撞层也设置了同样的属性】->准备工作确认完成后就想着怎么在Cocos里面获取到这些碰撞块-------判断触摸移动的代码在onTouchEnded()里面编写,剩下的就是碰撞检测代码的编写。
1.申明一个函数void setPlayerPos(Vec2 position)
函数实现的基本内容:
Vec2 tiledCoord=this->tileCoordFromPosition(position) ;//这个函数需要自己添加进去---用来把Cocos的坐标点转换到瓦片坐标
int tiledGid=_collidable->getTileIDAt(tileCoord); //_collidable是在init()函数中就初始化赋值指向collidable层
接下来就是判断tiledGid的值【大于0说明这个位置有东西,等于0则为空不用判断】
---->>>既然这个坐标有碰撞物体,我们又在TiledMap里面给该层的所有图块进行了赋值操作,剩下的就是取出该块的值并作判断
Value prop=_tiledMap->getPropertiesForGID(tiledGid) ; //获取对应GID下的变量
ValueMap propValueMap=prop.asValueMap(); //把prop转换为ValueMap后就能够用键值对的方式获取了 比较方便
std::string collidable=propValueMap["collidable"].asBool(); //后面赋值的格式就是键值对获取数据的格式
到这里基本上就算是全部完成了碰撞检测的东西
--------------细心的人肯定会问那个坐标转换的代码怎么实现的
tileCoordFromPosition(Vec2 position){
int x = position.x / _tiledMap->getTileSize().width; //这个很好理解
int y = (_tiledMap->getMapSize().height*_tiledMap->getTileSize().height - position.y) / _tiledMap->getTileSize().height; //这个有点懵逼
return Vec2(x, y);
}
-----------------------------------到这里准备工作全部做完了,剩下的就是在正确的位置调用正确的函数就好了。
还记得前面提到过的onTOUchEnded()函数里面添加player的移动坐标修改的判定代码?【简单的说就是点击屏幕后判断player下一次将要移动的位置playerNextMovePos】
接下来只需要把这个将要移动的位置参数传到setPlayerPosition(playerNextMovePos),然后运行程序。
bingo。-------------------bingo----------------------