



![]()
ボムを作ったので今度は喰らいボムを作ってみましょう。
ここで、キャラが変化するflagについておさらいしておきます。
ch.flagが
0の時は通常です。
1の時はボム受付中です。
2の時は死んで上に浮き上がっている状態です。
被弾した瞬間、flagを1にし、1である間、ボムを受け付けるようにします。
特にボムを受け付ける処理を追加しないといけないことはなく、
if(ch.flag==0 || ch.flag==1)
の時、ボムが登録できればいいので、変更する箇所は少ないです。
喰らいボム受付中は画面を暗くし、エフェクトを出してみましょう。
エフェクトはまた例によって、エフェクト登録用変数に登録します。
敵が死んだ時に使うエフェクト画像を自機から勢い良く発射してみます。
まずは下準備です。
---- 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){//エフェクトが登録されていたら
effect[i].x+=cos(effect[i].mvang)*effect[i].spd;
effect[i].y+=sin(effect[i].mvang)*effect[i].spd;
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://ボムのエフェクト
//スピード計算
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://ボムエフェクト(キャラ)
//明るさ計算
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://ボムのエフェクト(ライン)
//明るさ計算
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;
}
}
}
}
//ボム計算
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){//キャラが通常か喰らいボム状態で、ボムがオフなら
if(CheckStatePad(configpad.bom)==1){//ボムボタンが押されたら
enter_bom();
}
}
if(bom.flag==1){//ボムが登録されていたら
if(bom.cnt%10==0){//1/6秒に1回
n=(bom.cnt/10);
if(n<4 && (k=search_effect())!=-1){
effect[k].flag=1;
effect[k].cnt=0;
effect[k].knd=1;//エフェクト番号1:ボムのエフェクト
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();//ボム計算
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();//背景描画メイン
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);//ボムのエフェクト
graph_effect(2);//ボム線のエフェクト
graph_effect(3);//ボムキャラのエフェクト
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;//喰らいボム受付中は動かせない
実行結果
- Remical Soft -