ラスト弾幕警告の表示+続 嫌ネタ集

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

ラスト弾幕警告の表示+続 嫌ネタ集

投稿記事 by Tatu » 14年前

今回はラスト弾幕の警告の表示について書いていきます。
また、残り弾幕の数の表示についても書いてます。

今回の内容

1.考えたこと
2.画像と効果音の用意
3.変数などの用意
4.弾幕待機時間の変更
5.警告描画関数
6.設定などの変更
7.残り弾幕数

8.前回のホーミングの再修正


1.考えたこと

(1)どうやって描画を行うか?
エフェクトにすることも考えましたが画面枠が赤く光るという演出があるため、
描画関数を用意することにしました。

名前はgraph_warningとすることにします。

関数の内容ははラスト弾幕前の待機中に
LASTの文字画像を表示し、画面枠を赤くし、
効果音を鳴らすというものです。

計算に使うのはboss.wtimeでよいでしょう。


(2)ラスト弾幕とはいったい何のことでしょうか?

これはステージの最後のボスが放つ最後の弾幕です。
では、これを判断するのに必要な情報は何か?

考えた結果

a.そのステージの最後のボスは最初から数えて何番か(2体固定ならば不要だがおまけスペルの扱いが不明)
これをstage_boss_num[STAGE_NUM]とします。
最大ステージ数はSTAGE_NUM=5(本編)+1(EX)+1(PH)+1(おまけ)+1(ダミー)=9

b.今のステージ番号はいくつか?(stageという変数が用意されています)

c.今、何体目のボスか?boss.boss_numという変数を用意します。

d.そのボスの最後の弾幕の番号はいくつか?boss.danmaku_num[BOSS_MAX](添え字の中身を変えました)
BOSS_MAXは2×7ステージ+1(おまけ用)+1(ダミー)=16とします

e.今のボスの弾幕の番号はいくつか?(boss.kndという変数が用意されています)

の5つが必要であるとしました。

そして、ラスト警告を表示するのは
「c」が「bに対応するa」に等しく、かつ、「e」と「cに対応するd」が等しい場合としました。

また、出現時刻の数もボスの数に合わせなければなりません。


2.画像と効果音の用意

さて、まずは画像です。赤く光るのはDrawBoxで表現するので特に画像は必要ありません。
よってLASTの文字のみ用意すればよいことになります。

GV.hに以下を追加

CODE:

GLOBAL int img_last;//LASTの文字
load.cppのload()に以下を追加

CODE:

	img_last = LoadGraph("../dat/img/board/30.png");
次に効果音です。

load.cppのload()に以下を追加

CODE:

	sound_se[13]=LoadSoundMem("../dat/se/siren.wav");

3.変数などの用意

まずは定数の定義。

define.hを変更
以下を変更

CODE:

//ステージ数
#define STAGE_NUM 9
以下を追加

CODE:

//ボス最大数
#define BOSS_MAX 16
構造体のメンバ変数の変更と追加
struct.hの以下を変更

CODE:

//ボスの情報
typedef struct{
	//フラグ、カウンタ、種類、待機時間、状態、弾幕終了までのカウンタ、後ろの羽衣、表示フラグ
	int flag,cnt,knd,wtime,state,endtime,hagoromo,graph_flag;
	//HP,最大HP
	int hp,hp_max;
	//出現カウンタ数、各弾幕のHP、背景の種類、各ボスの最後の弾幕、何番のボスか
	int appear_count[BOSS_MAX],set_hp[DANMAKU_MAX],back_knd[DANMAKU_MAX],danmaku_num[BOSS_MAX],boss_num;
	//座標
	double x,y,dx,dy,ang,spd;
	//物理移動のための変数
	phy_t phy;
}boss_t;

グローバル変数の追加
GV.hに以下を追加

CODE:

GLOBAL int stage_boss_num[STAGE_NUM];//各ステージの最後のボスの番号
4.弾幕待機時間の変更
カウントが150では短かったので180カウントとしました。

boss_shot.cppの以下の関数を変更

CODE:

//ボスの待機処理
void waitandenter(){
	int t=180;
	boss.wtime++;
	if(boss.wtime>t)//180カウント待機したら弾幕セット
		enter_boss_shot();
}

5.
そして警告描画関数です。

最初に考えたことから条件を作りました。
そして、警告文字、赤く光る演出、警告音の順に処理を書いてます。

graph.cppに以下を追加

CODE:

void graph_warning(){
	//もし待機中でラスト弾幕前ならば
	if( boss.state==1
	&&  (boss.boss_num== stage_boss_num[stage])
	&&  (boss.knd == boss.danmaku_num[boss.boss_num]) ){
		//警告文字画像
		SetDrawArea(FX,FY,FX+FMX,FY+FMY);
		if(boss.wtime120){
			SetDrawBlendMode(DX_BLENDMODE_ALPHA,300-(boss.wtime-120)*10);
		}
		DrawRotaGraph(FX+FMX-boss.wtime,FY+100,1,0,img_last,TRUE);
		DrawRotaGraph(FX+boss.wtime,FY+FMY-100,1,0,img_last,TRUE);
		if(boss.wtime120){
			SetDrawBlendMode(DX_BLENDMODE_NOBLEND,0);
		}
		SetDrawArea(0,0,640,480);
		//赤く光らせる
		if(boss.wtime<180){
			SetDrawBlendMode(DX_BLENDMODE_ALPHA,255-3*(boss.wtime%90));
			DrawBox(0,0,416,16,color[2],TRUE);
			DrawBox(0,16,32,464,color[2],TRUE);
			DrawBox(0,464,416,480,color[2],TRUE);
			DrawBox(416,0,640,480,color[2],TRUE);
			SetDrawBlendMode(DX_BLENDMODE_NOBLEND,255);
		}
		//警告音
		if(boss.wtime==1 || boss.wtime==91){
			se_flag[13]=1;
		}
	}
}
graph_main()に以下を追加

CODE:

	graph_warning();//ラスト弾幕警告
これでラスト弾幕の警告の描画処理はかけました。

6.設定などの変更

しかし、今のままではどのボスがステージの最後かわからず、
ラスト弾幕かどうかを判断できないので設定します。

ini.cppを変更

first_ini()の前に初期化用の配列を用意する。

CODE:

//stage_boss_num[STAGE_NUM]の初期化に使う
int st_boss_num[STAGE_NUM]={
	1,3,5,7,9,11,13,14,15
};

first_ini()に以下を追加

CODE:

	for(int i=0;i<STAGE_NUM;i++){
		stage_boss_num[i]=st_boss_num[i];
	}
ini()に以下を追加

CODE:

	boss.boss_num=0;

どのボスでも対応できるように出現時刻と最後の弾幕の判定条件を変えます。
また、bossが死んだらboss.boss_numを増やすようにします。

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

CODE:

	if(stage_count==boss.appear_count[boss.boss_num] && boss.flag==0){//開始時間なら
		enter_boss(0);//開始
	}

CODE:

		if(boss.knd==boss.danmaku_num[boss.boss_num]){//出すべき弾幕をだしきったら
			boss.flag=0;//消す
			enter_dn(10,40);//(45)
			se_flag[9]=1;//ボスが死んだ音
			boss.boss_num++;
			return ;
		}
これでラスト弾幕の警告が出るようになったはずです。



7.残り弾幕数

今が何番目のボスか、そして何番目の弾幕をうっているのか、最後の弾幕はいくつかという情報から
残りの弾幕数を計算し、その数だけ星を表示します。

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

CODE:

	int danmaku = boss.danmaku_num[boss.boss_num]-boss.knd; 

CODE:

	if(boss.flag == 1){//もしボスがいたら
		//残り弾幕数の表示
		for(i=0;i<danmaku;i++){
			DrawRotaGraphFdF(FMX-15-10*i,15,0.8,0,img_etc[8],TRUE);
		}



8.前回のホーミングの再修正

前回のホーミング修正で時間切れで次の弾幕に移動したときにホーミングし続けるのが
なおっていなかったので修正します。

cshot.cppのcalc_homing()の以下を変更

CODE:

	//近い敵が見つかったら、あるいはボスがいて、弾幕中の時は角度をセット
	if(num!=-1 || (boss.flag==1 && boss.state==2 && boss.graph_flag==0)){



以下は「続 嫌ネタ集」です。あなたにとって龍神録や東方が
こんなだったら嫌だというようなことはありますか?
► スポイラーを表示

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