第二十三章 试着做出决死吧

>>点此回到教程目录

既然我们已经做好了Boom,那么现在我们来做决死吧。

在这里,我们先复习一下角色变化的flag。

ch.flag 在0的时候为通常。 在1的时候为正在进行决死。 在2的时候为已经被击毁正在上浮的状态。 中子弹的瞬间,将flag设置为1,在为1的时间范围内,开始进行Boom的处理。

并不是特地要去要去追加Boom处理,在

if(ch.flag==0 || ch.flag == 1)

的时候只要能够登录Boom即可,需要修改的地方很少。

我们决死处理中会把画面变暗,然后显示出特效吧。

特效也和之前那样,在特效登录用的变量中进行登录。

我们试着让自机猛地把敌人被击毁时使用的图像发射出去吧。

首先做一些预先准备。

—-在 char.cpp 的 calc_ch函数中进行以下追加 —-

void calc_ch(){
    if(ch.flag==1){//如果正在进行决死处理
        bright_set.brt=80;//变暗
        if(ch.cnt>20){//0.33秒中进行决死处理
            ch.flag   =2;    //1:正在进行决死处理 2:被击毁正在上浮中
            ch.cnt    =0;
            bright_set.brt=255;
        }
    }
    if(ch.cnt==0 && ch.flag==2){//如果在当前瞬间被击毁的话
        ch.x=FIELD_MAX_X/2;//设置坐标
        ch.y=FIELD_MAX_Y+30;
        ch.mutekicnt++;//进入无敌状态
    }
    if(ch.flag==2){//如果被击毁正在上浮的话
        unsigned int push=CheckStatePad(configpad.left)+CheckStatePad(configpad.right)
            +CheckStatePad(configpad.up)+CheckStatePad(configpad.down);
        ch.y-=1.5;//将角色往上移动
        //1秒钟以上,或者角色已经到达某个位置并且按下某键
        if(ch.cnt>60 || (ch.y<FIELD_MAX_Y-20 && push)){
            ch.cnt=0;
            ch.flag=0;//将角色状态还原
        }
    }
    if(ch.mutekicnt>0){//如果无敌计数不为0的话
        ch.mutekicnt++;
        if(ch.mutekicnt>150)//在150以上
            ch.mutekicnt=0;//还原
    }
    ch.cnt++;//角色计数器自增
    ch.img=(ch.cnt%24)/6;//决定当前的图像
}

—- effect.cpp 中的以下函数变更 —-

//计算特效
void calc_effect(){
        for(int i=0;i<EFFECT_MAX;i++){
                if(effect[i].flag>0){//如果特效已经被登录了
                        switch(effect[i].knd){//按照特效的种类进行分歧
                                case 0://敌人的消灭特效
                                        effect[i].cnt++;
                                        effect[i].r+=0.08;//特效的大小逐渐变大
                                        if(effect[i].cnt>10)//如果计数超过了10
                                                effect[i].brt-=25;//将亮度变暗
                                        if(effect[i].cnt>20)//如果计数超过了20
                                                effect[i].flag=0;//销毁
                                        break;
                                case 1:// Boom的特效
                                        //坐标计算
                                        effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
                                        effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
                                        //速度计算
                                        if(effect[i].cnt<60)
                                                effect[i].spd-=(0.2+effect[i].cnt*effect[i].cnt/3000.0);
                                        if(effect[i].cnt==60){
                                                effect[i].spd=0;
                                                se_flag[15]=1;
                                                dn.flag=1;
                                                dn.cnt=0;
                                                dn.size=11;
                                                dn.time=20;
                                        }
                                        //亮度和大小的计算
                                        effect[i].r+=0.015;
                                        if(effect[i].cnt<51)
                                                effect[i].brt+=5;
                                        if(effect[i].cnt>=60){
                                                effect[i].r+=0.04;
                                                effect[i].brt-=255/30.0;
                                        }
                                        //计数器自增以及消去计算
                                        effect[i].cnt++;
                                        if(effect[i].cnt>=90)
                                                effect[i].flag=0;
                                        break;
                                case 2:// Boom特效(角色)
                                        //座標計算 坐标计算
                                        effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
                                        effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
                                        //明るさ計算 亮度计算
                                        if(effect[i].cnt<51)
                                                effect[i].brt+=4;
                                        if(effect[i].cnt>130-51)
                                                effect[i].brt-=4;
                                        //计数器自增及消去计算
                                        effect[i].cnt++;
                                        if(effect[i].cnt>=130)
                                                effect[i].flag=0;
                                        break;
                                case 3://Boom的特效(线)
                                        //坐标计算
                                        effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
                                        effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
                                        //亮度计算
                                        if(effect[i].cnt<51)
                                                effect[i].brt+=2;
                                        if(effect[i].cnt>130-51)
                                                effect[i].brt-=2;
                                        //计数器自增与消去计算
                                        effect[i].cnt++;
                                        if(effect[i].cnt>=130)
                                                effect[i].flag=0;
                                        break;

                                /***修改请注意***/
                             case 4://决死特效
                             //亮度计算
                           if(effect[i].cnt>=6)
                                  effect[i].brt-=255/6;
                                effect[i].r+=0.12;
                              effect[i].cnt++;
                        if(effect[i].cnt>=12 || ch.flag!=1)
                                effect[i].flag=0;
                            break;
                                /***修改请注意***/

                                default:
                                        printfDx("effect设定错误\n");
                                        break;
                        }
                }
        }
}

//Boom计算
void bom_calc(){
        int n,k,shot_angle[4]={0,PI,PI/2,PI*1.5};//4发特效飞行的角度

        /***修改请注意***/
        if((ch.flag==0||ch.flag==1)
        /***修改请注意***/

          && bom.flag==0){//角色如果是通常状态或者在决死状态,且没有放Boom
                if(CheckStatePad(configpad.bom)==1){//如果Boom键被按下
                        enter_bom();
                }
        }
        if(bom.flag==1){//如果Boom已经被登录
                if(bom.cnt%10==0){//1/6秒一次
                        n=(bom.cnt/10);
                        if(n<4 && (k=search_effect())!=-1){
                                effect[k].flag=1;
                                effect[k].cnt=0;
                                effect[k].knd=1;//特效编号1:Boom的特效
                                effect[k].brt=0;
                                effect[k].ang=rang(PI);//随机的图像方向
                                effect[k].mvang=shot_angle[n]-PI/4;//飞行方向
                                effect[k].spd=13+rang(2);//速度
                                effect[k].r=0.5;//大小
                                effect[k].eff=2;//α混合
                                effect[k].img=img_eff_bom[(bom.cnt/10)/3];//图像
                                effect[k].x=ch.x;//坐标
                                effect[k].y=ch.y;
                        }
                }
                bom.cnt++;
                if(bom.cnt<40)
                        bright_set.brt=255-bom.cnt*5;//设定画面的亮度(暗)
                if(bom.cnt>90)
                        bright_set.brt=255-40*5+(bom.cnt-90)*5;//设定画面的的亮度(亮)
                if(bom.cnt>130){
                        bom.flag=0;
                        bright_set.brt=255;
                }
        }
}

void enter_crybom_effect(){
    int k;
    if(ch.flag==1){
        if(ch.cnt%2==0){
            if((k=search_effect())!=-1){
                effect[k].flag=1;
                effect[k].cnt=0;
                effect[k].knd=4;/决死特效
                effect[k].brt=255;
                effect[k].ang=rang(PI);
                effect[k].spd=0;
                effect[k].r=0;
                effect[k].eff=2;
                effect[k].img=img_del_effect[GetRand(4)];
                effect[k].x=ch.x;
                effect[k].y=ch.y;
            }
        }
    }
}

void effect_main(){
    dn_calc();//咚梆地摇动画面的计算
    calc_del_effect();//消灭特效计算
    calc_effect();//特效计算
    bom_calc();//Boom计算
    enter_crybom_effect();
}

—- out.cpp enemyshot_and_ch函数—-

//敌人射击和自机的处理
void enemyshot_and_ch(){
    int s,n;
    for(s=0;s<SHOT_MAX;s++){//敌人射击的子弹总数
        if(shot[s].flag>0){//如果射击登录了
            for(n=0;n<SHOT_BULLET_MAX;n++){//子弹总数
                if(shot[s].bullet[n].flag==1){//如果子弹已经登录
                    if(out_judge_enemyshot(s,n)==1){//且已经与自机接触
                        shot[s].bullet[n].flag=0;//销毁子弹

                        /***修改请注意***/
                        if(ch.flag==0 && ch.mutekicnt==0){
                             ch.cnt=0;
                             ch.flag=1;
                             se_flag[3]=1;
                        }
                        /***修改请注意***/

                    }
                }
            }
        }
    }
}

—- graph.cpp 的 graph_main函数变更—-

void graph_main(){
        if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

        graph_back_main();//背景描绘main
        graph_effect(0);//敌人击毁特效

        if(bright_set.brt!=255)SetDrawBright(255,255,255);

        graph_effect(4);//决死特效

        if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

        graph_enemy();//敌人的描绘
        graph_cshot();//自机射击的描绘

        if(bright_set.brt!=255)SetDrawBright(255,255,255);

        graph_ch();//自机的描绘

        if(bright_set.brt!=255)SetDrawBright(bright_set.brt,bright_set.brt,bright_set.brt);

        graph_bullet();//子弹的描绘

        if(bright_set.brt!=255)SetDrawBright(255,255,255);

        graph_effect(1);//Boom的特效
        graph_effect(2);//Boom线的特效
        graph_effect(3);//Boom角色的特效
        graph_board();//面板绘制
}

—- char.cpp 的 ch_move函数变更 —-

void ch_move(){
    int i,sayu_flag=0,joge_flag=0;
    double x,y,mx,my,naname=1;
    double move_x[4]={-4.0,4.0,0,0},move_y[4]={0,0,4.0,-4.0};
    int inputpad[4];
    inputpad[0]=CheckStatePad(configpad.left); inputpad[1]=CheckStatePad(configpad.right);
    inputpad[2]=CheckStatePad(configpad.down); inputpad[3]=CheckStatePad(configpad.up);

    /***修改请注意***/
    if(ch.flag==1)return;//如果正在进行决死处理就不能移动
    /***修改请注意***/

没有说明

运行结果



>>点此回到教程目录

results matching ""

    No results matching ""