第二十三章 试着做出决死吧
既然我们已经做好了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;//如果正在进行决死处理就不能移动
/***修改请注意***/
没有说明
运行结果