クリア処理について

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

クリア処理について

投稿記事 by Tatu » 14年前

今回はボスを倒した後に結果表示を行うようにします。
そして、1面がもう一度始まるようにします。


1.変数について
2.クリア状態にする
3.クリア時の処理・描画について

1.変数について
今回追加するのは
そのステージで使ったボムと被弾数
クリア時のボードとマークの画像のハンドル
画面のキャプチャを行うためのハンドル
クリア時の処理を制御するための変数とカウンタ
です。

struct.hのch_tに以下を追加

CODE:

	int used_bom;//使ったボム数
	int damage;//被弾数
GV.hに以下を追加

CODE:

GLOBAL int img_clear_board;//クリアボード
GLOBAL int img_clear_mark;//クリアマーク
GLOBAL int img_screen;//キャプチャ画像

CODE:

GLOBAL int clear_state;//クリア制御変数
GLOBAL int clear_count;//クリア時カウンタ
load.cppのload()に以下を追加

CODE:

	img_clear_board = LoadGraph("../dat/img/board/kekka_board.png");
	img_clear_mark = LoadGraph("../dat/img/board/29.png");
ini.cppのini()に以下を追加

CODE:

ch.used_bom=0;
ch.damage=0;

CODE:

clear_state=0;
clear_count=0;

また、func_stateが数字のままだとわかりにくいので
列挙型に変更します。以下の変更ではいろいろ書いてますが
今回つかうのはFIRST、GAME_INI,GAME_STG,PAUSE,CLEARです。
他のはきにしないでください。

GV.hの以下を変更

CODE:

//フラグ・ステータス変数
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への代入、func_stateによる場合分けを行っている部分を変更します。
とりあえず、今回までの処理が行えるようにします。
以下のようにfunc_stateの値を変更してください。

0 -> FIRST
99 -> GAME_INI
100 -> GAME_STG

main.cppのメインループ前に以下を追加

CODE:

	func_state=FIRST;
2.クリア状態にする

最後のボスを倒した時、クリア状態にし、
また、それ以降は計算、描画を行わない自機ショットを消去します。

boss_shot.cppのboss_shot_main()の以下を変更。

CODE:

		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の名前をgraph_stgに変更し、

新しくgraph_mainを追加する

CODE:

void graph_main(){
	switch(func_state){
	case GAME_STG:
		graph_stg();
		break;
	case CLEAR :
		graph_clear();
		break;
	}
}
これでボスを倒すとクリア画面が表示され、再び一面から始まるようになったはずです。

コメントはまだありません。