我是将遥感做成了一个prefab,这样角色移动还有技能的控制就可以通用了。
效果图如下,姑且叫它【御剑飞行】吧
思路:
① 遥感操作时,求得AB向量作为物体移动的方向,再求得AB与x轴的夹角angle作为物体的旋转角度
// 遥感的方向向量dir == 归一化向量AB
const dir = cc.v2(posX, posY).sub(this.m_ring.getPosition()).normalize();
// 根据向量求夹角弧度,2种方式
let radian = Math.atan2(dir.y, dir.x);
let radian = cc.v2(1, 0).signAngle(cc.v2(dir.x, dir.y))
// 弧度转角度 弧度 = Math.PI/180*angle
let angle = cc.misc.radiansToDegrees(radian);
② 物体通过定时器移动,每帧可以拿到自身的移动距离distance,再结合遥感所控制的方向便可得到下一帧的坐标。角度与遥感一致即可。
//定时器每帧移动距离
let distance = speed*dt;
//根据遥感的偏移坐标
let offPos = cc.v2(dir.x *distance, dir.y*distance)
//物体新坐标就等于旧坐标oldPos加偏移offPos
let newPos = cc.vec2.add(oldPos, offPos)
PS:案例代码中是为了方便直接在joystick中调用player的方法来控制player的移动。
这种设计方式将两者耦合在了一起,不可取。建议在实际项目中最好通过事件派发的方式来达到两者的结合使用。
资源下载地址:Joystick.rar