【龍神録プログラミング】難易度選択

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

【龍神録プログラミング】難易度選択

投稿記事 by Tatu » 14年前

掲示板で公開されていたゲームをやっていたため、
しばらくぶりの龍神録プログラミングです。

今回の内容

難易度を表す変数の追加
シューティング画面で難易度を表示する
ステージの敵配置に関する処理の変更
ボスに関する処理の変更
雑魚に関する処理の変更
難易度選択画面の追加
スペルプラクティスで難易度変更を行えるようにする



難易度を表す変数をdifficultyとし、0ならeasy、1ならhardを表していることにします。

GV.hに以下を追加

CODE:

GLOBAL int difficulty;//難易度
シューティング中に難易度を表示する処理を追加します。

graph.cppのgraph_board()に以下を追加

CODE:

	//難易度表示
	if(difficulty==0){
		DrawStringToHandle(FX+FMX+10,0,"EASY",color[0],font[0]);
	}
	else if(difficulty==1){
		DrawStringToHandle(FX+FMX+10,0,"HARD",color[0],font[0]);
	}
ステージの敵配置について

easy用のcsvを作成します。内容はコピペで十分です。
名前はstoryE*.csv(*は数字)という風にします。

難易度が上がるほど敵を増やすというだけなら、この作業の代わりに
出現する最低難易度の情報を追加するという方法でもよいかもしれません。

読み込み関数でこれらのcsvも読み込めるようにします。

load.cppのload_storyの以下を変更

CODE:

	char diff;//難易度に対応する文字
	switch(difficulty){
	case 0:
		diff='E';
		break;
	case 1:
		diff='H';
		break;
	}
	sprintf(fname,"../dat/csv/サンプル/story%c%d.csv",diff,stage);
ボス弾幕に関する変更

easy用の弾幕関数を書くため、,boss_shotE.cppを追加します。
今回は内容をコピペして弾幕関数の名前を変えるだけにします。
(boss_shot_bulletH***()をboss_shot_bulletE***()に変える)

boss_shot.hをつくり、弾幕関数用のファイルで共通して使用する関数の宣言をまとめてそれらにいれる。
使用する関数の定義を弾幕関数用のファイルに書いていた場合、その定義はshot.cpp,boss_shot.cppに移す。
boss_shotE.cpp,boss_shotH.cppのextern宣言をけし、#include "../include/boss_shot.h"を追加する。

func.hの内容を変更。
easy用の弾幕関数を使用するのに必要な文を追加します。
func.hにextern void boss_shot_bulletE***();を追加し、
関数ポインタを二次配列にします。

CODE:

void (*boss_shot_bullet[2][DANMAKU_MAX])() ={
	{
		boss_shot_bulletE000,
		...
	},
	{
		boss_shot_bulletH000,
		...
	},
};
このポインタを使用している所も変更します。

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

CODE:

	if(boss.state==2){//弾幕中なら
		boss_shot_bullet[difficulty][boss.knd]();//弾幕関数へ
		boss_shot_calc();//弾幕計算
	}
さらに回数に関するデータなども変更します。

GV.hの以下を変更

CODE:

GLOBAL int danmaku_challenge_num[2][DANMAKU_MAX];//弾幕挑戦回数
GLOBAL int danmaku_clear_num[2][DANMAKU_MAX];//弾幕クリア回数
boss_shot.cppの変更

enter_boss()の以下を変更

CODE:

	danmaku_challenge_num[difficulty][boss.knd]++;//挑戦回数を増やす
boss_shot_main()の以下を変更

CODE:

		//弾幕クリアに成功したらクリア回数を増やす
		if(danmaku_failure_flag==0){
			danmaku_clear_num[difficulty][boss.knd]++;
		}
graph.cppのgraph_board()の以下を変更

CODE:

		DrawFormatStringToHandle(FX+FMX-110,FY+20,color[0],font[0],"(%d/%d)",danmaku_clear_num[difficulty][boss.knd],danmaku_challenge_num[difficulty][boss.knd]-1);
雑魚の弾幕も同様に変更を加えます。
shotE.cppを追加。
shotH.cppの内容をコピペして、弾幕関数の名前を
shot_bulletH***()からshot_bulletE***()に変えます。

shot.cppにeasy用の弾幕関数のextern宣言を追加し、
関数ポインタを二次配列に変えます。

CODE:

void (*shot_bullet[2][SHOT_KND_MAX])(int) ={
	{
		shot_bullet_E000,...
	},
	{
		shot_bullet_H000,...
	}
};
shot_main()の以下を変更

CODE:

		//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
		if(shot[i].flag!=0 && 01) command=0;
	}
	if(CheckStatePad(configpad.up)==1){
		command--;
		if(commandboss.danmaku_num[stage_boss_num[0]]){
		difficulty++;
		if(difficulty>1){
			difficulty=0;
		}
		command=0;
	}
	else if(spell_stage!=0 && command>boss.danmaku_num[stage_boss_num[spell_stage]]-boss.danmaku_num[stage_boss_num[spell_stage-1]]-1){
		difficulty++;
		if(difficulty>1){
			difficulty=0;
		}
		command=0;
	}

	if(command0){
					DrawFormatStringToHandle(580,20*(i+1),color[0],font[0],"%4.1f%%",100.0f*danmaku_clear_num[difficulty][i]/danmaku_challenge_num[difficulty][i]);
				}
			}
			else{
				DrawFormatStringToHandle(0,20*(i+1),color[0],font[0],"%s",boss.danmaku_name[i+boss.danmaku_num[stage_boss_num[spell_stage-1]] + 1]);

				DrawFormatStringToHandle(470,20*(i+1),color[0],font[0],"%d/%d",
				danmaku_clear_num[difficulty][i+boss.danmaku_num[stage_boss_num[spell_stage-1]] + 1],
				danmaku_challenge_num[difficulty][i+boss.danmaku_num[stage_boss_num[spell_stage-1]] + 1]);
				if(danmaku_challenge_num[difficulty][i+boss.danmaku_num[stage_boss_num[spell_stage-1]] + 1]>0){
					DrawFormatStringToHandle(580,20*(i+1),color[0],font[0],"%4.1f%%",100.0f*danmaku_clear_num[difficulty][i+boss.danmaku_num[stage_boss_num[spell_stage-1]] + 1]
					/danmaku_challenge_num[difficulty][i+boss.danmaku_num[stage_boss_num[spell_stage-1]] + 1]);
				}
			}

		}
		break;
これで難易度選択を追加することができたはずです。

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