ページ 11

ボスの溜め動作について

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

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

Posted: 2009年10月02日(金) 23:21
by あ~る
龍神録のコードでゲームを作ってますか?
もしそうならエフェクトについては、ボムのエフェクトや敵の消滅するエフェクトで作り方を理解していれば簡単に実装出来る筈です

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

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

Posted: 2009年10月04日(日) 17:39
by yrao
了解しました

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

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

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

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

Posted: 2009年10月05日(月) 17:03
by Ma
サンプル的なものはないでしょうか?

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

Posted: 2009年10月05日(月) 21:29
by あ~る
一応僕が作ったのがあります
ありますが、自分で作った方がその人の為にもなるかなぁ?って思ってコードは乗せませんでした

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

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

Posted: 2009年10月06日(火) 01:47
by Ma
よろしくお願いします

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

Posted: 2009年10月06日(火) 15:06
by 鈴仙優曇華院イナバ
僕もできればコードを見させて頂きたいです。
どうしてもうまくいかなくて…

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

Posted: 2009年10月06日(火) 22:25
by あ~る
すいません遅れました;;
コード載せます。

-----------------------------------------------------------------------------------------
☆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時間程度でちょちょいっと作ったものなんで、まぁ参考程度にしてもらえれば光栄です。

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

Posted: 2009年10月06日(火) 23:01
by yrao
あ~るさんありがとうございます。

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

助かりました<(__)>

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

Posted: 2009年10月06日(火) 23:35
by あ~る
いえいえ、夏休みに作ったのにコメント書いてコピペしただけですので(^-^)
今見直してみたら、ちょっと数が多過ぎたかもしれません;;
まぁスピードとか数は好みで弄ってやって下さい

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

Posted: 2009年10月06日(火) 23:44
by あ~る
というかミス発見…
enter_charge関数内で、cntを使って色々やってますが、正しく動きません
直しときました
すいません…

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

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

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

Posted: 2009年10月07日(水) 21:28
by あ~る
もしかしたらコンパイラが違うからかもしれません
僕が使ってるコンパイラはBorlandC++なんで、そのせいかもしれません
原因の方はわかりません…すいません…

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

Posted: 2009年10月07日(水) 21:36
by Justy

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

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

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

Posted: 2009年10月07日(水) 21:59
by ももた
なるほど
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:ボスの溜め動作について

Posted: 2009年10月07日(水) 22:09
by あ~る
なるほど!
じゃあ

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

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

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

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

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

Posted: 2009年10月07日(水) 22:36
by あ~る
あ、あとサンプル弾幕の関数でenter_charge関数を呼んでいるところの記述は合ってますか?

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

Posted: 2009年10月07日(水) 22:40
by ももた
間違ってないです・・
ちょっと聞きたいのですが、あ~るさんは
effect[k].eff=0;のとき
graph.cpp内のvoid graph_effectの中はどうなっているのでしょうか?

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

Posted: 2009年10月07日(水) 22:42
by あ~る
ここは何にも弄ってないんで、龍神録の館の通りです

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

Posted: 2009年10月07日(水) 22:49
by ももた
そうですか。あとは念のため聞きたいのですが
void boss_shot_bulletH020()についてですが
これはeffect.cpp内に記述するのではなく
boss_shotH.cpp内に記述するんですよね?

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

Posted: 2009年10月07日(水) 22:59
by あ~る
はい、そうです
エフェクトが描画されないだけで、弾の方は描画されるんですよね?

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

Posted: 2009年10月07日(水) 23:03
by 127
自分は弾は描画されますが、エフェが描画されないです。
ソースコードはあ~るさんが修正した後のものと同じです。

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

Posted: 2009年10月07日(水) 23:04
by あ~る
あと、enter_charge関数の中で、printfDxで何か文字を書くとかして、enter_charge関数が呼ばれているかどうかも調べてみて下さい

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

Posted: 2009年10月07日(水) 23:08
by ももた
そうです。
修正したのはあと、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:ボスの溜め動作について

Posted: 2009年10月07日(水) 23:13
by あ~る
わかりました!
多分、graph_mainにgraph_effect(5)を書いてないと思います
これを適当な場所に書けば描画されると思います
追加に書き忘れてました、本当に申し訳無いです…

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

Posted: 2009年10月07日(水) 23:19
by 127
無事描画されました。
あ~るさん本当にありがとうございます。
すげえクオリティで驚きです。

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

Posted: 2009年10月07日(水) 23:19
by ももた
描画されました。
ありがとうございます。
ボスの中心に向かうようにすれば完璧ですね。

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

Posted: 2009年10月07日(水) 23:22
by あ~る
迷惑掛けて本当に申し訳無いです;;

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

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

Posted: 2009年10月07日(水) 23:34
by あ~る
さっきももたさんが載っけたコードの中で倍率を弄っるみたいなんで、case文の中にあるだんだん小さくする値を変えるか、速さを変えないと、ボスの中心座標に辿り着く前に消えちゃうと思います

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

Posted: 2009年10月07日(水) 23:38
by ももた
すみません。よくみたら中心に向かってました。
ありがとうございます。
ただ、一つ気になったのですが
ボスの中心の"周り"に集まって消えるのですが、
これを
完璧にボスの座標中心に集まってから消えるようにする方法とかないでしょうか?

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

Posted: 2009年10月08日(木) 00:00
by ももた
effect.x-=((effect.x-boss.x)/40);
effect.y-=((effect.y-boss.y)/40);
の40の値を小さくしたらいけました!
ほんとあ~るさんに感謝です。
ありがとうございました!

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

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

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

Posted: 2009年10月13日(火) 15:20
by 羽流布
ためさせてもらったのですが、これはすごいですね。驚きました!
これを利用してボスが死ぬエフェクトとかって作れないでしょうか?