游戏开发—跟踪导弹的最简单的算法
引擎: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赋值,可见顺时针旋转到面向玩家)