本教程用到的工具:Cocos2d-x 3.7、Unity插件Ferr2D Terrain Tool 1.0.8
原理:将Unity的优势为Cocos2d-x所用。使用Unity强大插件轻松拖出复杂2D地形,然后将地形点导出到plist文件给Cocos2d-x使用。
1.打开Unity并导入Ferr2D Terrain Tool插件:
2.创建一个带有物理属性的2D地形:
弹出对话框,这里我们做如图选择
3.为了让地形更平滑精致,我们做如图设置:
这里我们只需要顶部的顶点,只保留Top勾选
4.根据需求拖动设计地形:
Ferr2D Terrain Tool插件使用很简单,如果不明白可自行搜索相关教程
5.导出地形数据到plist文件,代码实现:
脚本下载链接:http://pan.baidu.com/s/1gdGp1mz 密码:zeka
代码中注释非常清楚了,这里不再详细说明。
6.将脚本拖给地形:
注意:由于要将Unity世界坐标系的点转换为屏幕坐标系(以像素为单位的点),所以场景中一定要有个Camera,操作如图: 将Camera拖到脚本的Camera位置
7.点击Unity运行按钮运行游戏,然后点击导出地图按钮:
默认导出路径是C://TerrainPoints.plist
8.Cocos2d-x读取地形plist文件:
Cocos2d-x读取plist文件很简单,代码如下:
//创建Dictionary
auto dic = Dictionary::createWithContentsOfFile("TerrainPoints.plist");
//定义一个Vector容器,用于存放所有地形点
std::vector terrainPointsVector;
//读取点的数组
auto arr = (Array*)dic->objectForKey("points");
for (int i = 0; i < arr->count(); i++)
{
auto pointStr = (String*)arr->getObjectAtIndex(i);
auto point = PointFromString(pointStr->getCString());
//将点放入vector容器
terrainPointsVector.push_back(point);
}
以Cocos2d-x封装物理为例:
auto terrainBody = PhysicsBody::create();//物理Body
auto terrainShape = PhysicsShapeEdgeChain::create(&terrainPointsVector[0],terrainPointsVector.size());//通过地形点创建物理shape
PhysicsMaterial mater;//设置地形的摩擦力等属性
mater.friction = 3.0f;
mater.restitution = 0.1f;
terrainShape->setMaterial(mater);
terrainBody ->addShape(terrainShape);//将物理shape绑定到物理Body
这样就创建了带有物理属性的地形曲线,效果如图:
当然,为了美观还要以terrainPoints容器中的顶点,用OpenGL来填充贴图:
最终效果: