第五十章 增加自动追踪的功能吧

>>点此回到教程目录

在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;
                }
        }
}

运行结果


>>点此回到教程目录

results matching ""

    No results matching ""