ボスの溜め動作について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yrao

ボスの溜め動作について

#1

投稿記事 by yrao » 16年前

ボスのエフェクトについての質問です。
東方では、ボスが弾幕やアシストを出すときに『溜め動作』のような事をすることがあると思います。(光がボスに向かって集まっていくようなエフェクトです)
あのエフェクトはどのように実装されているのでしょうか?

あ~る

Re:ボスの溜め動作について

#2

投稿記事 by あ~る » 16年前

龍神録のコードでゲームを作ってますか?
もしそうならエフェクトについては、ボムのエフェクトや敵の消滅するエフェクトで作り方を理解していれば簡単に実装出来る筈です

どっちにせよ、考え方としてはボスの座標から規定(若しくはランダム)の距離離れた場所にエフェクトの画像を表示して、あとはatan関数なんかを使ってボスへの角度を求めてやればいいと思います
その時最初大きめに描画して、だんだん小さくなるようにしてやれば、それっぽくなります

yrao

Re:ボスの溜め動作について

#3

投稿記事 by yrao » 16年前

了解しました

エフェクト処理を書いていってみようと思います。

プログラムの書き方について疑問が出てきたら、また質問させて下さい。

ありがとうございましたm(__)m

Ma

Re:ボスの溜め動作について

#4

投稿記事 by Ma » 16年前

サンプル的なものはないでしょうか?

あ~る

Re:ボスの溜め動作について

#5

投稿記事 by あ~る » 16年前

一応僕が作ったのがあります
ありますが、自分で作った方がその人の為にもなるかなぁ?って思ってコードは乗せませんでした

で、今要望があるなら書こうかなぁって思ったんですが、なんかサイトにパソコンからアクセスしようと思ったら出来ないみたいなんで……
なんででしょう?僕のパソコンだけでしょうか?携帯でも出来なかったんですけど……

Ma

Re:ボスの溜め動作について

#6

投稿記事 by Ma » 16年前

よろしくお願いします

鈴仙優曇華院イナバ

Re:ボスの溜め動作について

#7

投稿記事 by 鈴仙優曇華院イナバ » 16年前

僕もできればコードを見させて頂きたいです。
どうしてもうまくいかなくて…

あ~る

なんちゃって龍神録プログラミングの館 番外4章 ボスのチャージエフェクト

#8

投稿記事 by あ~る » 16年前

すいません遅れました;;
コード載せます。

-----------------------------------------------------------------------------------------
☆function.hに以下を追加

//effect.cpp
GLOBAL void enter_charge();

☆effect.cppのcalc_effect関数内に以下を追加

case 5://魔力チャージエフェクト
		    effect.cnt++;
		    effect.r-=0.07;//段々小さく
		    if(effect.cnt>30)
		    	effect.flag=0;//30カウントで消す
		  effect.x-=((effect.x-boss.x)/30);
		  effect.y-=((effect.y-boss.y)/30);
		    break;

☆effect.cppに以下の関数を追加


//適当な位置
double random_pos(int i){//iが0の時はx座標、1の時はy座標を返す
	double pos,pos_x,pos_y;
	double ang=rang(PI2);
	pos=100+(GetRand(100));
	pos_x=pos*cos(ang);
	pos_y=pos*sin(ang);
	if(i==0)return pos_x;
	if(i==1)return pos_y;
}

//溜めエフェクト登録
void enter_charge(){
	int k;
	if(boss_shot.cnt%3==0){//3カウントに一個
			if((k=search_effect())!=-1){
				effect[k].flag=1;
				effect[k].x=boss.x+random_pos(0);
				effect[k].y=boss.y+random_pos(1);
				effect[k].cnt=0;
				effect[k].knd=5;
				effect[k].brt=255;
				effect[k].spd=0;
				effect[k].r=2.8;//最初は少し大きめに描画
				effect[k].img=img_etc[49];
				effect[k].eff=0;
		}
	}
}

☆graph.cppのgraph.main内に以下を追加

graph_effect(5);

☆サンプル弾幕

void boss_shot_bulletH020(){
	#define TM020 200
	int k,i,t=boss_shot.cnt,t2=boss_shot.cnt%TM020;
	if(t2<80)enter_charge();
	if(t2==100){
		for(i=0;i<36;i++){
			if((k=search_boss_shot())!=-1){
				boss_shot.bullet[k].knd=0;
				boss_shot.bullet[k].col=0;
				boss_shot.bullet[k].flag=1;
				boss_shot.bullet[k].angle=PI2/36*i;                   
				boss_shot.bullet[k].x=boss.x;
				boss_shot.bullet[k].y=boss.y;
				boss_shot.bullet[k].cnt=0;
				boss_shot.bullet[k].spd=3;
				boss_shot.bullet[k].state=0;
			}
		}
	}	
}

--------------------------------------------------------------------------------------

多分これでOKのはずです。
画像は自分で適当な物を用意してください(僕は21*21のサイズの画像を使ってます)
ボスの所に集まるように移動させる、角度の求め方を失敗して面倒臭くなっちゃったんで、なんか変な移動のさせ方してますが悪しからず。。。
もうちょっと良いやり方があるような気がするんですが、結構前に1~2時間程度でちょちょいっと作ったものなんで、まぁ参考程度にしてもらえれば光栄です。

yrao

Re:なんちゃって龍神録プログラミングの館 番外4章 ボスのチャージエフェクト

#9

投稿記事 by yrao » 16年前

あ~るさんありがとうございます。

自分も手詰まりになってしまって、質問しようと思っていたところだったのですが、サンプルまで作って頂いていたとは…

助かりました<(__)>

あ~る

Re:ボスの溜め動作について

#10

投稿記事 by あ~る » 16年前

いえいえ、夏休みに作ったのにコメント書いてコピペしただけですので(^-^)
今見直してみたら、ちょっと数が多過ぎたかもしれません;;
まぁスピードとか数は好みで弄ってやって下さい

あ~る

Re:ボスの溜め動作について

#11

投稿記事 by あ~る » 16年前

というかミス発見…
enter_charge関数内で、cntを使って色々やってますが、正しく動きません
直しときました
すいません…

ももた

Re:ボスの溜め動作について

#12

投稿記事 by ももた » 16年前

分からないことがあったのですが、
サンプルを試してみたのですが、なぜか描画されません。
enter_charge内のeffect[k].imgは直したのですが、どうやら
そこが原因ではないようで困ってます。
また、double random_pos(int i)内で
warning C4715: 'random_pos' : 値を返さないコントロール パスがあります。
という警告が発生し、消したいのですがどうしたら消えるか、誰かアドバイスお願いします。

あ~る

Re:ボスの溜め動作について

#13

投稿記事 by あ~る » 16年前

もしかしたらコンパイラが違うからかもしれません
僕が使ってるコンパイラはBorlandC++なんで、そのせいかもしれません
原因の方はわかりません…すいません…

Justy

Re:ボスの溜め動作について

#14

投稿記事 by Justy » 16年前


>という警告が発生し、消したいのですがどうしたら消えるか

 メッセージの通りです。
 random_pos関数で i=0と i=1の時は returnで値を戻していますが、
それ以外の時はどうしていますか?

ももた

Re:ボスの溜め動作について

#15

投稿記事 by ももた » 16年前

なるほど
return -1;
を付け加えたら警告が消えました。ありがとうございます。
//適当な位置
double random_pos(int i){
	double pos,pos_x,pos_y;
	double ang=rang(PI2);
	pos=100+(GetRand(100));
	pos_x=pos*cos(ang);
	pos_y=pos*sin(ang);
	if(i==0){
		return pos_x;
	}
	if(i==1){
		return pos_y;
	}
	return -1;
}
描画されないのは何が原因なのでしょうか?
それとvoid enter_charge()内の
int iは意味はあるのでしょうか?一度も使われていないという警告が出たので
消したのですが、もしかして必要だったのでしょうか?

あ~る

Re:ボスの溜め動作について

#16

投稿記事 by あ~る » 16年前

なるほど!
じゃあ

if(i==0){
return pos_x;
}else if(i==1){
return pos_y;
}else{
printfDx("引数error");
}

というようにしてやれば大丈夫でしょうか?
引数は自分で入力するものだからと安心して想定外の数字の場合の処理をしてませんでした、申し訳無いです…
というかコメントで引数の意味を書いとけば良かったですね、すいません、直しときます
携帯からなんで↑のプログラムが変になってたらすいません

あ~る

Re:ボスの溜め動作について

#17

投稿記事 by あ~る » 16年前

ありゃ、被ったorz
iは意味無いですね、癖で使うかもしれない変数を最初に宣言して掲示板に書く時に消すの忘れてました
描画され無い事についてはよくわかりませんが、ロードが上手く出来てない、若しくはハンドルが間違ってたりはしませんか?

あ~る

Re:ボスの溜め動作について

#18

投稿記事 by あ~る » 16年前

あ、あとサンプル弾幕の関数でenter_charge関数を呼んでいるところの記述は合ってますか?

ももた

Re:ボスの溜め動作について

#19

投稿記事 by ももた » 16年前

間違ってないです・・
ちょっと聞きたいのですが、あ~るさんは
effect[k].eff=0;のとき
graph.cpp内のvoid graph_effectの中はどうなっているのでしょうか?

あ~る

Re:ボスの溜め動作について

#20

投稿記事 by あ~る » 16年前

ここは何にも弄ってないんで、龍神録の館の通りです

ももた

Re:ボスの溜め動作について

#21

投稿記事 by ももた » 16年前

そうですか。あとは念のため聞きたいのですが
void boss_shot_bulletH020()についてですが
これはeffect.cpp内に記述するのではなく
boss_shotH.cpp内に記述するんですよね?

あ~る

Re:ボスの溜め動作について

#22

投稿記事 by あ~る » 16年前

はい、そうです
エフェクトが描画されないだけで、弾の方は描画されるんですよね?

127

Re:ボスの溜め動作について

#23

投稿記事 by 127 » 16年前

自分は弾は描画されますが、エフェが描画されないです。
ソースコードはあ~るさんが修正した後のものと同じです。

あ~る

Re:ボスの溜め動作について

#24

投稿記事 by あ~る » 16年前

あと、enter_charge関数の中で、printfDxで何か文字を書くとかして、enter_charge関数が呼ばれているかどうかも調べてみて下さい

ももた

Re:ボスの溜め動作について

#25

投稿記事 by ももた » 16年前

そうです。
修正したのはあと、enter_charge()内の
if(boss_shot_cnt%3==0){//3カウントに一個
の部分ですがboss_shot_cntは定義してなかったので
boss_shot.cntに直したくらいです。
念のためse_flag[14]=1;//キュイーン音を
追加してみましたところ、ボスが弾幕発射するとき、
音は鳴りましたので、描画だけ何かおかしいと・・
//溜めエフェクト登録
void enter_charge(){
	int k;
	if(boss_shot.cnt%3==0){//3カウントに一個
		if((k=search_effect())!=-1){
			effect[k].flag=1;
			effect[k].x=boss.x+random_pos(0);
			effect[k].y=boss.y+random_pos(1);
			effect[k].cnt=0;
			effect[k].knd=5;
			effect[k].brt=255;
			effect[k].spd=0;
			effect[k].r=1.5;//最初は少し大きめに描画
			effect[k].img=img_eff_bom[0];
			effect[k].eff=0;
			se_flag[14]=1;//キュイーン音
		}
	}
}

あ~る

Re:ボスの溜め動作について

#26

投稿記事 by あ~る » 16年前

わかりました!
多分、graph_mainにgraph_effect(5)を書いてないと思います
これを適当な場所に書けば描画されると思います
追加に書き忘れてました、本当に申し訳無いです…

127

Re:ボスの溜め動作について

#27

投稿記事 by 127 » 16年前

無事描画されました。
あ~るさん本当にありがとうございます。
すげえクオリティで驚きです。

ももた

Re:ボスの溜め動作について

#28

投稿記事 by ももた » 16年前

描画されました。
ありがとうございます。
ボスの中心に向かうようにすれば完璧ですね。

あ~る

Re:ボスの溜め動作について

#29

投稿記事 by あ~る » 16年前

迷惑掛けて本当に申し訳無いです;;

>>中心に向かえば完璧
ちゃんと中心に向かうようになってる筈ですが……?

あ~る

Re:ボスの溜め動作について

#30

投稿記事 by あ~る » 16年前

さっきももたさんが載っけたコードの中で倍率を弄っるみたいなんで、case文の中にあるだんだん小さくする値を変えるか、速さを変えないと、ボスの中心座標に辿り着く前に消えちゃうと思います

ももた

Re:ボスの溜め動作について

#31

投稿記事 by ももた » 16年前

すみません。よくみたら中心に向かってました。
ありがとうございます。
ただ、一つ気になったのですが
ボスの中心の"周り"に集まって消えるのですが、
これを
完璧にボスの座標中心に集まってから消えるようにする方法とかないでしょうか?

ももた

Re:ボスの溜め動作について

#32

投稿記事 by ももた » 16年前

effect.x-=((effect.x-boss.x)/40);
effect.y-=((effect.y-boss.y)/40);
の40の値を小さくしたらいけました!
ほんとあ~るさんに感謝です。
ありがとうございました!

あ~る

Re:ボスの溜め動作について

#33

投稿記事 by あ~る » 16年前

喜んで貰えてなによりです(^-^)
僕のミスで無駄な時間を使わせてしまってほんと申し訳無いです
僕も今回色々と自分のプログラムの粗いところがわかりました…
これからも精進していくんでお互い頑張りましょう!

羽流布

Re:ボスの溜め動作について

#34

投稿記事 by 羽流布 » 15年前

ためさせてもらったのですが、これはすごいですね。驚きました!
これを利用してボスが死ぬエフェクトとかって作れないでしょうか?

閉鎖

“C言語何でも質問掲示板” へ戻る