游戏开发—跟踪导弹的最简单的算法 和atan()反正切函数的运用

游戏开发—跟踪导弹的最简单的算法

引擎:CocosCreater > 语言:JS

有子弹攻击类型的游戏必然少不了跟踪导弹,对于小游戏而言;简单易懂且实现功能才是最完美的。
跟踪导弹的效果我们不用多说:简单说一下大体思路。
1 >任何的追踪都是具备旋转和朝向对方位移,所以需要了解向量。
2>对lerp()函数有一定了解。
同样方法有很多中,接下来我们按照说的简单思路看代码:

预先声明好一些变量,每个变量都会有用
 this.missiles_Speed = 400;//追踪者速度
 this.missiles_Dir = cc.v2(0,1);//追踪者初始的方向
 this.track_Time = 0;//追踪计时时间
 this.track_LifeTime = 8;//追踪者存活时间 
 this.missiles_RiseTime = 0.6;//追踪者上升时间
 this._missiles_Speed = 0;
每帧里调用,实现最总效果;一点一点看啊
this.track_Time += dt;
if(this.track_Time >= this.track_LifeTime){//导弹的生命时间到达
       this.missileDeath();//追踪者死亡处理函数
       return;
 }
let _dir = (this.track_Time < this.missiles_RiseTime) ? this.missiles_Dir : this.player.position.sub( this.node.position).normalizeSelf();//当小于上升时间,向量为初始化向量往上飞 ,向量改变为导弹到玩家的向量
        let _missiles_Dir = this.missiles_Dir;//临时向量
        this.missiles_Dir =  this.missiles_Dir.lerp(_dir,0.04).normalizeSelf();//le r p后返回一个新的向量
        this.node.x += this._missiles_Speed * dt * this.missiles_Dir.x;
        this.node.y += this._missiles_Speed * dt * this.missiles_Dir.y; //让导弹产生位移
        if(this._missiles_Speed < this.missiles_Speed){
            this._missiles_Speed += 5;//存在一个加速度的效果
        }
        else{
            this._missiles_Speed = this.missiles_Speed;//到达最大速度
        }
        let angle = _missiles_Dir.signAngle(this.missiles_Dir) * 180 / Math.PI;//上一次的向量到lerp后的向量角度
        this.node.angle +=  angle;//更新角度




        

//不断的按照向量方向移动,同时不断的跟新自己的角度。实现的跟踪效果;总之方式存在很多效果也不同,适合需求的才是最好的。
另外写到这突然想到了atan2函数,归属于Math类中。对于这个函数有什么用,顺便简单给大家介绍一下下:仅供参考!
反正切函数,结果返回的是x轴到某个坐标的角度(网上介绍很多,有必要自行阅读一下)
https://blog.csdn.net/weixin_42142612/article/details/80972768
那么我们能用他做什么?当然有了角度,你想干什么都可以啊。

这段代码就是使用atan2()进行旋转,实现敌人始终面朝玩家并不断的接近玩家
   setBossMove: function(){
        var point = cc.v2(this.node.x, this.node.y);
        var boss_Dir = this.player.position.sub(point);
        var distance = point.sub(this.player.position).mag();
        var x2 = point.x + this.speed * boss_Dir.x / distance;
        var y2 = point.y + this.speed * boss_Dir.y / distance;
        var newPosition = cc.v2(x2, y2);
        var x1 = point.x;
        var y1 = point.y;
        var angle = 90 - Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
        this.node.angle = -angle;
        if(distance <= this.bossAttribute.spacing){
            //停止运动后的逻辑 
            return;
        }
        this.node.setPosition(newPosition);
    },

该代码主要难理解的地方就是atan2;建议先看一下函数的意义;(比如:x1,y1在左上角,x2,y2是左下角,这样是在第四象限中算出夹角是负的,然后开始的时候人物的脸朝向上方;-(90 - 负数);最后在给angle赋值,可见顺时针旋转到面向玩家)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值