ページ 11

こういう弾幕を再現したいのですが・・・

Posted: 2009年10月27日(火) 01:02
by 59221
作成してみたのですが、
弾の挙動が全然異なってしまいました…。
void boss_shot_bulletH002(){
    static int a=-60,angle=-91;
	int t=boss_shot.cnt%180;

	if(t%2==0){
		for(i=0;i<5;i++){
			bullet_way( boss.x, boss.y, 1, angle + (a*(1+a/100)), 0, 2.25, 8, 5, 0);
			angle += 360/5;
		}
		a+=2;
	}

}
bullet_way関数はhttp://sinkai.net/rp/0.phpを使わせて頂いています。

どなたかangle部分のヒントを教えて頂けないでしょうか…?

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 01:46
by array
初めまして

> どなたかangle部分のヒントを教えて頂けないでしょうか…?

多分、ケロちゃん風雨に負けず の波が非常にヒントになるのではないでしょうか。
あれを360°方向に打てば、同じ結果になりますよね。
http://dixq.net/rp/30.html



---------戯言
自分も作ってみたのですが
地霊殿との違いに気づかず、文花帖を見ながら作ってました。

混乱させてしまったら申し訳ないですが、地霊殿の方を作ろうとしたら
やっぱり、ケロちゃん風雨に負けずに近い形になると思います。
void boss_shot_bulletH002()
{
    int t = boss_shot.cnt;
    // ベース角(1.0ずらす)
    static double angle = 1.0;

    if( t%2 == 0 ) {
        bullet_way( boss.x, boss.y, 5, angle*t, PI2/5, 2.25, 8, 5, 0);
    }
    if( t%100 == 0 ) {
        // 角度反転
        angle *= -1.0;
    }
}

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 03:29
by array
申し訳ないです。色んな動画みていたら、「波と粒の境界」は色んな動作をするんですね。

折り返しで、動作が切り替わるのは、59221さんのような定式使ってるんですかね・・・・私には分かりません。
似せれるように頑張ってみたのですが、私が作ると、ifを大量に使った醜いプログラムになりそうなので
諦めます・・・。

途中のシンプルなプログラムのせておきます。参考になれば、利用してください。
void boss_shot_bulletH000()
{
    int t = boss_shot.cnt%180;
    if( t%2 == 0) {
        bullet_way( boss.x, boss.y, 5, -sin(PI/180*t)*5.0f, PI2/5, 2.25, 8, 5, 0);
    }
}

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 09:07
by Tatu
想起「波と粒の境界」(easy)をみて作ってみました。

//弾発射関数
void boss_bullet_on(int way,int knd,int col,double x,double y,double b_angle,double d_angle,double spd,int state,int till,int eff=0,int sflag=1){
	int i=0,k;
	for(i=0;i<way;i++){
		if((k=search_boss_shot())!=-1){
			boss_shot.bullet[k].knd   = knd;//弾の種類
			if(knd==7) boss_shot.bullet[k].kaiten=1;
			else boss_shot.bullet[k].kaiten=0;
			boss_shot.bullet[k].col   = col;//弾の色
			boss_shot.bullet[k].flag  = 1;
			boss_shot.bullet[k].cnt   = 0;
			boss_shot.bullet[k].x     = x;//座標
			boss_shot.bullet[k].y     = y;
			boss_shot.bullet[k].angle = b_angle+d_angle*(i - way/2);//角度:bが基準、dが間隔
			boss_shot.bullet[k].spd   = spd;//スピード
			boss_shot.bullet[k].state = state;//弾の状態
			boss_shot.bullet[k].till  = till;//弾が画面外に出ても消えない時間
			boss_shot.bullet[k].eff	  = eff;//加算ブレンドするか否か
			if(sflag==1)se_flag[0]=1;
		}
	}
}

void boss_shot_bulletT098(){
	int t=boss_shot.cnt;
	double angle;
	if(t==0){
		boss.x=FMX/2;
		boss.y=FMY/2;
	}
	boss_shot.base_angle[0]+=t*PI/1600;
	angle=boss_shot.base_angle[0];
	boss_bullet_on(1,8,6,boss.x+20*cos(angle),boss.y+20*sin(angle),angle   ,0,3,0,0);
	boss_bullet_on(1,8,6,boss.x-20*cos(angle),boss.y-20*sin(angle),angle+PI,0,3,0,0);
}

ところで、角度が度数法に見えるのですが、それは大丈夫なのでしょうか。

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 09:24
by 59221
いろいろと作って頂きすみません…
array様の式で本家にかなり近い動きが再現できていてありがとうございます。
動作の式でangle + (a*(1+a/100))と100で割っているのは
aが2ずつ増えるようにして、50カウント周期で動作がころころ変更されるように
してみたものですが…
だめでした…

波粒を真似た東方弾幕風のスクリプトではこのように記述されていたのですが…
task Shot{
	let angle = -91;
	let a = -60;
	loop{
		loop(2){
			CreateShot01(GetX(敵X), GetY(敵Y), 2.25(弾速), angle + (a*(1+a/100))(角度), PURPLE12(画像種類指定), 15(CreateShot01で指定してからどれくらいで撃つかのフレーム数));
			angle += 360 / 5;(5wayにする)
		}
		a+=2;
		wait(2);
	}
}
ケロちゃんでももうちょっと頑張ってみます。

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 18:27
by 59221
あ、tatuさんの投稿と重なってしまった…。
スルーしてるみたいになってしまい申し訳ありません…。
わざわざ作成までして頂いて本当にありがとうございます…。
あ、確かに…自分のは度数法でやっていました…w
何をしてるんだ私は…

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 19:56
by 59221
これのノーマルを作ってみましたが、弾がばらついてしまいました…
イージーは2way、ノーマル以降は5wayなので、同じ要領で関数を増やしてみたのですが…

void boss_shot_bulletT098(){
int t=boss_shot.cnt;
double angle;
if(t==0){
boss.x=FMX/2;
boss.y=FMY/2;
}
boss_shot.base_angle[0]+=t*PI/1600;
angle=boss_shot.base_angle[0];
boss_bullet_on(1,8,6,boss.x+20*cos(angle),boss.y+20*sin(angle),angle ,0,3,0,0);
boss_bullet_on(1,8,6,boss.x-20*cos(angle),boss.y-20*sin(angle),angle+PI2/5,0,3,0,0);
boss_bullet_on(1,8,6,boss.x+20*cos(angle),boss.y+20*sin(angle),angle+PI2/5*2 ,0,3,0,0);
boss_bullet_on(1,8,6,boss.x-20*cos(angle),boss.y-20*sin(angle),angle+PI2/5*3,0,3,0,0);
boss_bullet_on(1,8,6,boss.x+20*cos(angle),boss.y+20*sin(angle),angle+PI2/5*4 ,0,3,0,0);

}

angle以外に変更する場所はありますか?
聞いてばかりで本当にすみません…

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 22:27
by Tatu
発射する方向を2つから5つに変更したものです。

void boss_shot_bulletT099(){
	int i,t=boss_shot.cnt;
	double angle;
	if(t==0){
		boss.x=FMX/2;
		boss.y=FMY/2;
	}
	boss_shot.base_angle[0]+=t*PI/1600;
	angle=boss_shot.base_angle[0];
	if(t%2==0){
		for(i=0;i<5;i++){
			angle=boss_shot.base_angle[0]+i*PI2/5;
			boss_bullet_on(1,8,6,boss.x+20*cos(angle),boss.y+20*sin(angle),angle,0,3,0,0);
		}
	}
}

前にのせたコードで弾を発射しているところは
boss_bullet_on(1,8,6,boss.x+20*cos(angle),boss.y+20*sin(angle),angle   ,0,3,0,0);
boss_bullet_on(1,8,6,boss.x-20*cos(angle),boss.y-20*sin(angle),angle+PI,0,3,0,0);
こう書いてありますが
-cos(angle)==cos(angle+PI)
-sin(angle)==sin(angle+PI)
だからです。

前回のものでも今回のものでも
ボスから見た弾の発射位置の方向とその位置から発射される弾の方向は同じになっていることがわかるとおもいます。
よくわからない場合はいらない紙にでも図を書いてみてください。

なお、地霊殿の想起「波と粒の境界」は
easyだと2way
normalだと5way
hardだと8way
lunaticは8wayでhardより弾が速い
という風になっています。

Re:こういう弾幕を再現したいのですが・・・

Posted: 2009年10月28日(水) 23:05
by 59221
forで5回繰り返して同時出しすればよかったんですか…
な、なるほど…
-cos(angle)==cos(angle+PI)
-sin(angle)==sin(angle+PI)
高校の頃の知識をすっかり忘れていました。
Tatuさんのおかげで再び思いだせました。
だからイージー2番目の弾幕関数のところをangle+PIにしていたんですね・・・

地霊殿の想起hardは8wayでしたか・・・
勝手にノーマル以上は5wayと思い込んでいました…

無事にhardとlunaticも再現できました~!

もっと弾幕を真似る技術を修行しないといけないですね…
Tatuさんのこの弾幕を印刷して毎日眺めてみます。
まだまだもっと真似たい弾幕があるので、自力で解決できるよう精進します。
sinをかけたりして弾幕を生成するのが苦手なようなのでここを重点的に
勉強します。
何から何までありがとうございます。
あと、度数法にはこれからも気をつけます・・・w