しばらくぶりの龍神録プログラミングです。
今回の内容
難易度を表す変数の追加
シューティング画面で難易度を表示する
ステージの敵配置に関する処理の変更
ボスに関する処理の変更
雑魚に関する処理の変更
難易度選択画面の追加
スペルプラクティスで難易度変更を行えるようにする
難易度を表す変数をdifficultyとし、0ならeasy、1ならhardを表していることにします。
GV.hに以下を追加 シューティング中に難易度を表示する処理を追加します。
graph.cppのgraph_board()に以下を追加
//難易度表示
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の以下を変更
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***();を追加し、
関数ポインタを二次配列にします。
void (*boss_shot_bullet[2][DANMAKU_MAX])() ={
{
boss_shot_bulletE000,
...
},
{
boss_shot_bulletH000,
...
},
};
boss_shot.cppのboss_shot_main()の以下を変更
if(boss.state==2){//弾幕中なら
boss_shot_bullet[difficulty][boss.knd]();//弾幕関数へ
boss_shot_calc();//弾幕計算
}
GV.hの以下を変更
GLOBAL int danmaku_challenge_num[2][DANMAKU_MAX];//弾幕挑戦回数
GLOBAL int danmaku_clear_num[2][DANMAKU_MAX];//弾幕クリア回数
enter_boss()の以下を変更 boss_shot_main()の以下を変更
//弾幕クリアに成功したらクリア回数を増やす
if(danmaku_failure_flag==0){
danmaku_clear_num[difficulty][boss.knd]++;
}
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宣言を追加し、
関数ポインタを二次配列に変えます。
void (*shot_bullet[2][SHOT_KND_MAX])(int) ={
{
shot_bullet_E000,...
},
{
shot_bullet_H000,...
}
};
//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
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;