【教程】射击游戏跟踪弹如何用cocos creator实现?实现下图的效果。
超简单,只需在update里2步即可实现,思路如下:
第一步:让子弹朝敌人旋转一个小角度,看起来子弹逐渐旋转最终朝向敌人,只需使用smallAngleRotate这个函数即可。
第二步:让子弹运动,使用cc.Node的translate方法即可。
具体调用代码实现如下,2行代码即可搞定,是不是超简单呢?
// 子弹追踪敌人,在update中进行调用即可
upadte(dt: number) {
// 第一步,子弹旋转,bulletNode为子弹节点,targetAngle为子弹与敌人的相对角度,每帧最大旋转10度
bulletNode.angle = smallAngleRotate(bulletNode.angle, targetAngle, 10)
// 第二步,子弹移动,每帧移动20距离
bulletNode.translate(new Vec3(20, 0, 0)
}
第一步用到的smallAngleRotate函数源码如下所示,只需复制粘贴即可。
/**
* 一个角度朝目标角度小幅度旋转,常用于update做跟踪效果
* @param curAngle 当前角度
* @param targetAngle 目标角度
* @param stepAngle 单次旋转最大角度,必须为正整数
* @returns 旋转后的角度
*/
function smallAngleRotate(curAngle: number, targetAngle: number, stepAngle: number): number {
curAngle = getStandardAngle(curAngle)
targetAngle = getStandardAngle(targetAngle)
if (stepAngle <= 0) throw new Error('stepAngle必须为正整数')
let ang: number
if (curAngle > targetAngle) {
ang = curAngle - targetAngle
if (ang <= stepAngle) {
ang = targetAngle
} else if (ang <= 180) {
ang = curAngle - stepAngle
} else {
ang = curAngle + stepAngle
}
} else {
ang = targetAngle - curAngle
if (ang <= stepAngle) {
ang = targetAngle
} else if (ang <= 180) {
ang = curAngle + stepAngle
} else {
ang = curAngle - stepAngle
}
}
return getStandardAngle(ang)
}
/**
* 获取标准角度:(-180, 180]
* @param angle 角度
* @returns 标准角度
*/
function getStandardAngle(angle: number): number {
if (angle > -180 && angle <= 180) return angle
angle = angle % 360
angle = angle <= -180 ? angle + 360 : angle
angle = angle > 180 ? angle - 360 : angle
return angle
}
到此即可实现跟踪弹效果,超简单~