第五十章 增加自动追踪的功能吧
在49章中我们为自机的射击增加了Option了呢。这一章我们试着为射击增加自动追踪的处理吧。
各个子弹如果会寻找最就近的敌人,然后往敌人的方向飞去。
两个点与点的角度计算和之前一样使用atan2函数。
自动最终处理有必要分为Boss存在与Boss不存在两种情况。
即便boss.flag为有效的,由于当Boss的HP为0的时候不存在碰撞判定,Boss的flag为有效且Boss的HP大于0的时候我们才进行Boss的自动追踪处理。
其次,自机射击这个东西,单纯地进行增加是不行的(译者注:指的是单纯地增加子弹数)。
刚开始是1束子弹,但每次power up之后会像2束……6束这样子增加,在这个时候会单纯地变为之前6倍的强度。
如果这样的话,在power max的情况下10秒钟能解决的敌人在power为0的时候要花1分钟。
实际上总体的强度的增加并不是1倍、2倍……这样子增加,而是以0.1倍、0.2倍为单位来增加,这样的话会比较合理。
因此,在同时发射的子弹数量增加的同时,我们同时进行削减子弹威力的处理吧。
(如果您认为“power up反而要削弱子弹的威力?”有点不可思议的话,我在这里多说明一下。比如从1束子弹变为2束(同时发射2个子弹)的时候,假设1束子弹每1个子弹的power是10的话,如果我们把2束子弹的每1个子弹的power降低6,那么整体来看其实是增加了1.2倍。也就是这个道理。)
如果子弹变得更加有力了的话,作为玩家仅凭这一点也就能够产生的确变强了的印象。
power up的时候,实际上子弹的威力并不是突然就增加,为了让展示显得没有跳跃,我们让子弹的威力在一段时间内微微地进行提升。
由于这里的调整如果不一边玩一边调整的话会很困难的,不管怎么说,那边的调整也就先做到合适就行了。
—-在 cshot.cpp 中进行以下追加 —-
//通常射击登录
void ch0_shot_pattern(){
int k;
/***修改请注意***/
int n=cshot0num[ch.power<200?0:1];
for(int i=0;i<n;i++){
/***修改请注意***/
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x[i];
cshot[k].y=ch.y+cshot0pos_y[i];
/***修改请注意***/
cshot[k].power= (n<2 ? 20 : 12) + ch.power/100;//2束子弹的话20,4束子弹的话12 (50)
/***修改请注意***/
cshot[k].knd=0;
cshot[k].img=img_cshot[0];//图像编号代入(49)
}
}
se_flag[2]=1;//发射声有效
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=20;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=10-7*(i/2);//注意不要为负数(50)
cshot[k].knd=1;
cshot[k].img=img_cshot[1];//图像编号代入 (49)
}
}
}
}
//低速通常射击登录
void ch1_shot_pattern(){
int k;
/***修改请注意***/
int n=cshot0num[ch.power<200?0:1];
/***修改请注意***/
for(int i=0;i<n;i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=-PI/2;
cshot[k].spd=20;
cshot[k].x=ch.x+cshot0pos_x[i]/3;//低速中的话将位置往中心偏移
cshot[k].y=ch.y+cshot0pos_y[i]/2;
/***修改请注意***/
cshot[k].power= (n<2 ? 20 : 12) + ch.power/100;//2束的话20,4束的话12(50)
/***修改请注意***/
cshot[k].knd=0;
cshot[k].img=img_cshot[0];//图像编号代入(49)
}
}
se_flag[2]=1;
if(ch.power>=100){
for(int i=0;i<(ch.power<300?2:4);i++){
if((k=search_cshot())!=-1){
cshot[k].flag=1;
cshot[k].cnt=0;
cshot[k].angle=option0ang[i];
cshot[k].spd=20;
cshot[k].x=option_bb[i%2].x;
cshot[k].y=option_bb[i%2].y;
cshot[k].power=10-7*(i/2);//注意不要为负数(50)
cshot[k].knd=1;
cshot[k].img=img_cshot[1];//图像编号代入(49)
}
}
}
}
(略)
//寻找就近的敌人并设置角度
/***修改请注意***/
void calc_homing(int k){
int i,d, num=-1, min=-1;
double x,y;
if(boss.flag==0){//Boss不在的时候
for(i=0;i<ENEMY_MAX;i++){//敌人的总数次
if(enemy[i].flag==1){
x=(enemy[i].x-cshot[k].x);
y=(enemy[i].y-cshot[k].y);
d=(int)(x*x+y*y);//子弹与敌人的距离
if(d<min || min==-1){//计算结果为最小值或者还没有保存任何值
num=i;//编号记录
min=d;//距离记录
}
}
}
}
//如果找到就近的敌人的话,又或者Boss存在且HP不为0的时候设置角度
if(num!=-1 || boss.flag==1 && boss.hp>0){
if(boss.flag==0){
x=enemy[num].x-cshot[k].x;
y=enemy[num].y-cshot[k].y;
}
else{
x=boss.x-cshot[k].x;
y=boss.y-cshot[k].y;
}
cshot[k].angle=atan2(y,x);
}
}
/***修改请注意***/
//射击的移动计算
void calc_cshot(){
for(int i=0;i<CSHOT_MAX;i++){
if(cshot[i].flag==1){
int dranx=(int)(cshot[i].spd+11/2),drany=(int)(cshot[i].spd+55/2);
/***修改请注意***/
if(cshot[i].knd==1)
calc_homing(i);
/***修改请注意***/
cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
cshot[i].cnt++;
if(cshot[i].x<-dranx || cshot[i].x>FMX+dranx ||
cshot[i].y<-drany || cshot[i].y>FMY+drany)//在画面外往外跑的话
cshot[i].flag=0;
}
}
}
运行结果