> - 引擎:CreatorCocos2.0.5
> - 系统:Windows
今天花了几个小时时间,在思考如何去实现自定义线条,并且具有物理性质
大概实现了这么个效果
线条是根据触摸点移动位置去画的,上面带了刚体,球也具有物理性质,所以不会掉下去,产生碰撞以后球会沿着线的路径移动
实现
因为引擎本身不具备自定义线条并且富于物理性质的功能,所以此功能只能手动实现
我的想法是把手移动过得地方看成一个一个被拆分开的线段,无限细分之后,根据一段距离去生成一小节线段,一点一点连起来,形成一整条(表述可能有点问题,具体看代码)
/**
* 触摸开始时
*/
touchScreenStart(ev) {
// 记录第一个点的位置
this._recordPos = ev.getLocation()
cc.log('开始', this._recordPos)
},
/**
* 触摸移动时
*/
touchScreenMove(ev) {
// 记录当前手移动到的点
this._currentPos = ev.getLocation()
//求两点之间的距离
let subV = this._currentPos.subSelf(this._recordPos)
let lenV = subV.mag() + 5
// cc.log('长度2', lenV)
// 如果距离大于一定值,这里的25是预制体的width
if(lenV >= 25) {
// 给定方向向量
let tempVec = cc.v2(0, 10)
// 求两点的方向角度
let rotateV = subV.signAngle(tempVec) / Math.PI * 180 - 90
// 创建预制体,这里使用了对象池,getPool()是拉取对象池的节点
let PoolData = this.getPool()
PoolData.rotation = rotateV
PoolData.parent = this.node
// 这一步是为了防止两个线段之间出现空隙,动态改变预制体的长度
PoolData.setPosition(ev.getLocation().x, ev.getLocation().y)
PoolData.width = lenV
PoolData.getComponent(cc.PhysicsBoxCollider).offset.x = -PoolData.width / 2
// cc.log(PoolData.getComponent(cc.PhysicsBoxCollider).size)
cc.log(PoolData.getComponent(cc.PhysicsBoxCollider).size.width, PoolData.width)
PoolData.getComponent(cc.PhysicsBoxCollider).size.width = PoolData.width
PoolData.getComponent(cc.PhysicsBoxCollider).apply()
// 将此时的触摸点设为记录点
this._recordPos = ev.getLocation()
}
},
大概就是这些
若有错误,欢迎指出。
开源万岁
Mr.YingS