【教程】射击游戏跟踪弹的实现分享

【教程】射击游戏跟踪弹如何用cocos creator实现?实现下图的效果。
track
超简单,只需在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
  }

到此即可实现跟踪弹效果,超简单~

4赞

大佬厉害。我标记下,等用得着时再来看