起因:我想做一个导弹的实现,同时我不想用物理系统去实现,所以就想看看有没有动作系统能实现。然后就翻文档,找到了cc.follow 这个动作。
官方文档给的解释:
追踪目标节点的位置。
例子:
// example
// creates the action with a set boundary
var followAction = cc.follow(targetNode, cc.rect(0, 0, screenWidth * 2 - 100, screenHeight));
node.runAction(followAction);
// creates the action with no boundary set
var followAction = cc.follow(targetNode);
node.runAction(followAction);
我想这样应该就可以实现导弹的效果,结果不行。
cc.follow 这个动作的效果是 直接将自身节点的位置赋值为目标节点的位置, 并且之后一直保持自身节点位置与目标节点位置相同
类似:
update(dt){
this.node.position = target.position
}
所以 cc.follow 应该算是一个瞬时的动作。 很奇怪的一点是,在官方文档 cc.follow 被归为了 时间间隔动作。
后面我又试了一下, cc.follow 没有 duration 这个参数(也就是 多少时间完成动作) 也没有 easing 方法(缓动动作) 这些都不符合 时间间隔动作 的定义。
最后说一下 我怎么在不使用物理系统做的导弹追踪吧。
如果用物理系统 那就是让 导弹的运动角度插值旋转指向目标点,然后一直给导弹一个向前的速度就好了·。
不是物理系统,我是先用一个 cc.bezierTo 做一个贝塞尔曲线做导弹前半部分轨迹 和 cc.rotateBy 旋转一定角度(这里我没有让导弹一定要旋转到"对准"目标) 然后当 贝塞尔轨迹动作结束后 在 update 里面 让 this.node.position += (target.position - this,node.position) * dt 就好了 也就是一个向量的加减法 来完成导弹的后半部分轨迹。