模拟纸飞机运动动画 PaperPlaneAnim
项目需要模拟一个纸飞机飞到目的地的动画,用cocos的moveto动画不能满足需求,因为纸飞机总是向着飞机头朝向移动。
所以需要考虑飞机头的朝向,计算目标点和飞机的夹角,飞机前进的过程中按转向角速度this.angularSpeed
修改飞机的角度angle
fly函数 传入飞机的目的地位置targetPos
,初始化数据
public fly(targetPos: cc.Vec2, cb?: () => void, circleAngle?) {
this._targetCallBack = cb;
targetPos = this.flyNd.parent.convertToNodeSpaceAR(targetPos);
this._targetPos = targetPos;
this._speed = 0;
this._circleAngleCnt = 0;
this._circleFactor = 0;
this.circleAngle = circleAngle == null ? this.circleAngle : circleAngle;
this._flyStatus = FlyStatus.AccCircle;
}
update里根据飞机的位置this.flyNd.position
和targetPos
计算得到夹角this._targetAngle
//计算目标位置在飞机的方位。
let radian = Math.atan2(this.flyNd.y - this._targetPos.y, this.flyNd.x - this._targetPos.x);
this._targetAngle = 180 / Math.PI * radian;
this._targetAngle = (360 + this._targetAngle) % 360;
计算飞机当前角度 curAngle
并计算curAngle
与this._targetAngle
的差diffAngle
let curAngle = (360 + (this.flyNd.angle + this.defaultPlaneAngleOffset) % 360) % 360;
let diffAngle = this._targetAngle - curAngle;
根据设置的角速度angularSpeed
修改飞机的角度
if (Math.abs(diffAngle) > 1) {
let factorAngle = this._targetAngle - curAngle > 0 ? 1 : -1;
if (Math.abs(this._targetAngle - curAngle) > 180) {
factorAngle *= -1;
}
this.flyNd.angle += factorAngle * this.angularSpeed;
}
飞机总是向着飞机头的方向前进,根据飞机角度curAngle