そして、1面がもう一度始まるようにします。
1.変数について
2.クリア状態にする
3.クリア時の処理・描画について
1.変数について
今回追加するのは
そのステージで使ったボムと被弾数
クリア時のボードとマークの画像のハンドル
画面のキャプチャを行うためのハンドル
クリア時の処理を制御するための変数とカウンタ
です。
struct.hのch_tに以下を追加 GV.hに以下を追加
GLOBAL int img_clear_board;//クリアボード
GLOBAL int img_clear_mark;//クリアマーク
GLOBAL int img_screen;//キャプチャ画像
img_clear_board = LoadGraph("../dat/img/board/kekka_board.png");
img_clear_mark = LoadGraph("../dat/img/board/29.png");
また、func_stateが数字のままだとわかりにくいので
列挙型に変更します。以下の変更ではいろいろ書いてますが
今回つかうのはFIRST、GAME_INI,GAME_STG,PAUSE,CLEARです。
他のはきにしないでください。
GV.hの以下を変更
//フラグ・ステータス変数
typedef enum{
FIRST,
OPENING,
TITLE,
GAME_INI,
STAGE_INI,
NORMAL_OPENING,
GAME_MURA,
PH_OPENING,
GAME_STG,
PAUSE,
GAME_OVER,
CLEAR,
ENDING,
}fs_t;
GLOBAL fs_t func_state;//関数制御用変数
とりあえず、今回までの処理が行えるようにします。
以下のようにfunc_stateの値を変更してください。
0 -> FIRST
99 -> GAME_INI
100 -> GAME_STG
main.cppのメインループ前に以下を追加 2.クリア状態にする
最後のボスを倒した時、クリア状態にし、
また、それ以降は計算、描画を行わない自機ショットを消去します。
boss_shot.cppのboss_shot_main()の以下を変更。
if(boss.knd==boss.danmaku_num[boss.boss_num]){//出すべき弾幕をだしきったら
boss.flag=0;//消す
enter_dn(10,40);//(45)
se_flag[9]=1;//ボスが死んだ音
if(boss.boss_num==stage_boss_num[stage]){//最後のボスを倒したらクリア状態にする
for(int i=0;i0) rank_point--;
rank_point+=ch.damage;
switch(rank_point){
case 0:
c='S';
break;
case 1:
c='A';
break;
case 2:
c='B';
break;
case 3:
c='C';
break;
default:
c='D';
break;
}
//各情報を描画
if(clear_count>90)
DrawFormatStringToHandle(FX+100,120,color[0],font[1],"残機数 %d",ch.num);
if(clear_count>120)
DrawFormatStringToHandle(FX+100,150,color[0],font[1],"被弾数 %d",ch.damage);
if(clear_count>150)
DrawFormatStringToHandle(FX+100,180,color[0],font[1],"使用ボム %d",ch.used_bom);
if(clear_count>180)
DrawFormatStringToHandle(FX+100,210,color[0],font[1],"グレイズ %d",ch.graze);
if(clear_count>210)
DrawFormatStringToHandle(FX+100,240,color[0],font[1],"ポイント %d",ch.point);
if(clear_count>240)
DrawFormatStringToHandle(FX+100,270,color[0],font[1],"スコア %d",ch.score);
if(clear_count>300)
DrawFormatStringToHandle(FX+155,350,color[6],font[1],"ランク %c",c);
}
//クリア時の描画処理
void graph_clear(){
//クリアマーク計算用
int x,y;
double size,angle;
switch(clear_state){
case 0:
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_item();//アイテム描画
graph_effect(6);//ヒットエフェクトの描画
graph_effect(5);//溜めエフェクトの描画
if(bright_set.brt!=255)SetDrawBright(255,255,255);
graph_ch();//自機の描画
graph_effect(1);//ボムのエフェクト
graph_effect(2);//ボム線のエフェクト
graph_effect(3);//ボムキャラのエフェクト
graph_board();//ボードの描画
graph_clear_board();
if(clear_count>360 && CheckStatePad(configpad.shot) ==1 ){
clear_state=1;
clear_count=0;
//画面のキャプチャを行う
img_screen=MakeGraph(640,480);
GetDrawScreenGraph(0,0,640,480,img_screen);
//音楽を止める
StopSoundMem(area.bgm.handle);
delete_bgm();
}
draw_fps(0,465);//fps描画
draw_func_tm(450,250);//処理時間描画
break;
case 1://徐々に暗くなる
SetDrawBright(255-clear_count,255-clear_count,255-clear_count);
DrawGraph(0,0,img_screen,TRUE);
SetDrawBright(255,255,255);
if(clear_count==120){
clear_state=2;
clear_count=0;
}
break;
case 2://クリアマークを動かす
SetDrawBright(135,135,135);
DrawGraph(0,0,img_screen,TRUE);
SetDrawBright(255,255,255);
if(clear_count180 && CheckStatePad(configpad.shot) ==1){
DeleteGraph(img_screen);
func_state=GAME_INI;
}
break;
}
}
新しくgraph_mainを追加する これでボスを倒すとクリア画面が表示され、再び一面から始まるようになったはずです。