ザコに関する処理

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

ザコに関する処理

投稿記事 by Tatu » 14年前

今回の内容は以下の二つです。

1.ザコの出現エフェクト
2.ザコのHP表示


1.ザコの出現エフェクト

まずは画像を用意します。
GV.hに追加

CODE:

GLOBAL int img_eff_enemy_appear[2][6];//敵出現中の画像
GLOBAL int img_eff_appear[16];//敵出現エフェクト、弾消しエフェクトの画像
load.cppのload()に以下を追加

CODE:

	LoadDivGraph( "../dat/img/enemy/appear20.png", 6 , 6 ,  1 , 100, 100,img_eff_enemy_appear[0]);
	LoadDivGraph( "../dat/img/enemy/appear21.png", 6 , 6 ,  1 , 100, 100,img_eff_enemy_appear[1]);
	LoadDivGraph( "../dat/img/enemy/appear.png", 16, 4 , 4 , 32 , 32 , img_eff_appear);
enemy.cppで敵が出現する120フレーム前にエフェクトを登録する。
また、出現時にもエフェクトを登録する。


出現120フレーム前のエフェクトの画像はx座標が真ん中よりも左なら右向きになるようにし、
右なら左向きになるようにし、それぞれ別のエフェクトとして扱います。
このエフェクトは移動するので敵出現位置と重なるようにエフェクトを出す時のy座標はその分ずらします。

enemy.cppに以下を追加

CODE:

extern int search_effect();
enemy_enter()に以下を追加

CODE:

    int i,j,k,t;
	if(boss.flag!=0)return;
    for(t=0;t<ENEMY_ORDER_MAX;t++){
		if(enemy_order[t].cnt-120 == stage_count){//現在が出現2秒前なら
			if((k=search_effect())!=-1){
				effect[k].ang=0;
				effect[k].brt=128;
				effect[k].cnt=0;
				effect[k].col=0;
				effect[k].eff=1;
				effect[k].flag=1;
				if(enemy_order[t].x<FMX/2)	effect[k].knd=7;
				else effect[k].knd=8;
				effect[k].mvang=-PI/2;
				effect[k].r=1.0;
				effect[k].spd=0;
				effect[k].x=enemy_order[t].x;
				effect[k].y=enemy_order[t].y+120;				
			}
		}

effect.cppのcalc_effect()に以下を追加

CODE:

				case 7://敵出現エフェクト(右向き)
					if(effect[i].cnt<60 && effect[i].cnt%12==0){
						effect[i].img=img_eff_enemy_appear[0][effect[i].cnt/12];
					}
					if(effect[i].cnt==60){
						effect[i].spd=2;
					}
					if(effect[i].cnt==120){
						effect[i].flag=0;
					}
					effect[i].cnt++;
					break;
				case 8://敵出現エフェクト(左向き)
					if(effect[i].cnt<60 && effect[i].cnt%12==0){
						effect[i].img=img_eff_enemy_appear[1][5-effect[i].cnt/12];
					}
					if(effect[i].cnt==60){
						effect[i].spd=2;
					}
					if(effect[i].cnt==120){
						effect[i].flag=0;
					}
					effect[i].cnt++;
					break;
もうひとつのエフェクトは画像の切り替えを行い、終わったら消えるというようにします。
こちらのエフェクトはボス登場時の弾消しにも流用することができます。

enemy_enter()の以下を変更する

CODE:

        if(enemy_order[t].cnt==stage_count){//現在の瞬間がオーダーの瞬間なら
            if((i=enemy_num_search())!=-1){
                enemy[i].flag    =1;//フラグ
                enemy[i].cnt    =0;//カウンタ
                enemy[i].pattern=enemy_order[t].pattern;//移動パターン
                enemy[i].muki    =1;//向き
                enemy[i].knd    =enemy_order[t].knd;//敵の種類
                enemy[i].x        =enemy_order[t].x;//座標
                enemy[i].y        =enemy_order[t].y;
                enemy[i].sp        =enemy_order[t].sp;//スピード
                enemy[i].bltime    =enemy_order[t].bltime;//弾の発射時間
                enemy[i].blknd    =enemy_order[t].blknd;//弾幕の種類
                enemy[i].blknd2    =enemy_order[t].blknd2;//弾の種類
                enemy[i].col    =enemy_order[t].col;//色
                enemy[i].wait    =enemy_order[t].wait;//色
                enemy[i].hp        =enemy_order[t].hp;//体力
                enemy[i].hp_max =enemy[i].hp;//体力最大値
				enemy[i].back_col=GetRand(4);
                enemy[i].vx     =0;//水平成分の速度
                enemy[i].vy     =0;//鉛直成分の速度
                enemy[i].ang    =0;//角度
                for(j=0;j<6;j++)
                    enemy[i].item_n[j]=enemy_order[t].item_n[j];//落とすアイテム
				if((k=search_effect())!=-1){
					effect[k].ang=0;
					effect[k].brt=255;
					effect[k].cnt=0;
					effect[k].col=0;
					effect[k].eff=1;
					effect[k].flag=1;
					effect[k].knd=9;
					effect[k].r=1;
					effect[k].spd=0;
					effect[k].x=enemy_order[t].x;
					effect[k].y=enemy_order[t].y;
				}
            }
        }
effect.cppのcalc_effect()に以下を追加

CODE:

				case 9://敵出現エフェクト
					if(effect[i].cnt%8==0){
						effect[i].img=img_eff_appear[effect[i].cnt/8];
					}
					if(effect[i].cnt==63){
						effect[i].flag=0;
					}
					effect[i].cnt++;
					break;
これらのエフェクトを描画する処理を追加します。

graph.cppのgraph_stgに以下を追加

CODE:

	graph_effect(7);//敵出現エフェクト(右向き)
	graph_effect(8);//敵出現エフェクト(左向き)
	graph_effect(9);//敵出現、弾消しエフェクト

テスト時に気になったので以下の処理を修正。

音楽に関して
music.cppのbgm_main()の以下を修正。

CODE:

		if(stage_count == boss.appear_count[stage_boss_num[stage]]){//ラスボスが現れたら読み込む

CODE:

				if(stage_count == boss.appear_count[stage_boss_num[stage]]){//ラスボスが現れたら再生
進行度の表示に関して
graph.cppのgraph_develop()の以下を修正。

CODE:

		//自機画像を表示
		DrawRotaGraphF(16.0,FMY/2+200-400.0*stage_count/boss.appear_count[stage_boss_num[stage]],0.5,0,img_ch[0][(stage_count/30)%4],TRUE);
	}

2.ザコのHP表示


敵自体の描画にくっつけて処理します。

表示の仕方は枠をかいてModiGraphでゲージの描画を行うというようにします。

枠とゲージの画像を用意します。
GV.hに以下を追加

CODE:

GLOBAL int img_enemy_hp[2];//敵HP表示用画像
load.cppのloadに以下を追加。

CODE:

	img_enemy_hp[0]= LoadGraph( "../dat/img/enemy/hp11.png");
	img_enemy_hp[1]= LoadGraph( "../dat/img/enemy/hp2.png");
graph.cppのgraph_enemy()を以下のように変更

CODE:

//敵描画
void graph_enemy(){
	int i;
	for(i=0;i<ENEMY_MAX;i++){
		if(enemy[i].flag==1){
			DrawRotaGraphFdF(enemy[i].x,enemy[i].y,1.0f,0.0f,img_enemy[0][enemy[i].img],TRUE);
			DrawRotaGraphFdF(enemy[i].x+16,enemy[i].y-16,1.0f,0.0f,img_enemy_hp[0],TRUE);
			DrawModiGraphFdF(enemy[i].x+16-10,enemy[i].y-16-1,enemy[i].x+16-10+20*enemy[i].hp/enemy[i].hp_max,enemy[i].y-16-1,
							 enemy[i].x+16-10+20*enemy[i].hp/enemy[i].hp_max,enemy[i].y-16+1,enemy[i].x+16-10,enemy[i].y-16+1,
							 img_enemy_hp[1],TRUE);
		}
	}
}
これで敵の出現エフェクトとHPの表示ができたはずです。






SAIさん
ショットの比較動画の作成お疲れ様です。
書き忘れたことってなんでしょうね?
一発に何フレームかかるか。一発当たりの威力はいくらか とかでしょうか?
それともホーミングは威力は低いですが確実に攻撃が当たります とかでしょうか?

そして安地。本当によく見つけられますね。

(前回の日記へのコメントから)四聖龍(たつ)神録かあ。
達神録というのはどうでしょう。本家よりも難易度が上がったモードとかで。

アバター
SAI
記事: 115
登録日時: 14年前

Re: ザコに関する処理

投稿記事 by SAI » 14年前

どもです。
思い出さないということは忘れてなどないか、大したことじゃないかどちらかでしょうw
安地はいつも弾幕をじっくり見ることで見つけています。
とかっこよさげなこといってますが、ようするに勘です。あと運。

>達神録というのはどうでしょう。本家よりも難易度が上がったモードとかで。
達人が神化して達神ってことでしょうか。面白いネーミングですw