弾の速度制限

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

弾の速度制限

#1

投稿記事 by スタートメニュー » 15年前

只今、敵が放つ弾幕のスピードについてやっているのですが、
”時間が経つにつれてスピードが変わる+一定の速度以上からしか弾を出さない”書き方を調べています。
上記説明が少々わかりにくいので
t*0.1で1以上 
のようなspdの書き方を教えていただきたいしだいです。

尚、
shot[n].bullet[k].spd =t*0.1>1;
このように書くと1に満たない弾は止まってしまいます。

ご意見よろしくお願いします。

Dixq (管理人)

Re:弾の速度制限

#2

投稿記事 by Dixq (管理人) » 15年前

うむむ・・すみません意図がいまいちよく理解出来ていません。

時間がたつにつれてスピードを変化させたいなら、カウンタによってスピードを変化させればいいですね。
セットするスピードもその仰っているスピード以下にならないように計算すればいいのではないでしょうか?

「t*0.1で1以上」という意味がわかりません。
弾幕が始まってからの時間ですか?

>shot[n].bullet[k].spd =t*0.1>1;
>このように書くと1に満たない弾は止まってしまいます。

このような書き方は出来ないと思います(出来ないというよりおそらく思った通りにいかない)
もう少し詳しくわかりやすく、やりたいことを教えて頂けると何かアドバイス出来るかも知れません

チルチル

Re:弾の速度制限

#3

投稿記事 by チルチル » 15年前

もしかして東方でよくある「後から撃った弾が先に撃った弾を追い抜く」ような感じですか?
だったら
shot[n].bullet[k].spd=1+t*0.1;
で良いんじゃないでしょうか?
まあ長時間撃つならtを%でも使って調整する必要がありますが・・

ALFA

Re:弾の速度制限

#4

投稿記事 by ALFA » 15年前

if構文等で
・弾速が上限の速度に到達していない場合は、弾が射出されてからの時間に対して一定の値で加速して移動
・弾速が上限の速度に到達している場合はそのままの速度で移動

のように条件分岐すればいいのでしょうか……ね。


if(shot[n].bullet[k].spd <1)
{
shot[n].bullet[k].spd=0.1 * t;
}
if(shot[n].bullet[k].spd <= 1)
{
shot[n].bullet[k].spd = 1;
}


とりあえず上記のものだと最大速が1になってると思います。
私も始めたばかりなのでこの程度が限界で申し訳ないです。

チルチル

Re:弾の速度制限

#5

投稿記事 by チルチル » 15年前

確かに「発射してから加速する」という意味にも取れますね・・

それなら
shot[n].bullet[k].spd=1+t*0.1;
でも行けそうですが

初期値の他に最大値もあるとすると・・
shot[n].bullet[k].spd=(t<20)?1+t*0.1:3;
見たいな感じでしょうかね?

スタートメニュー

Re:弾の速度制限

#6

投稿記事 by スタートメニュー » 15年前

皆様色々なご回答本当に感謝いたします。
自分の説明下手で本当に申し訳ございません。

追い越し弾ですね。言葉が見つかりませんでした。
チルチルさんのshot[n].bullet[k].spd=1+t*0.1;参考にさせていただきました。
ありがとうございました。

問題解決と同時に問題が発生しました。
shot[n].bullet[k].spd=1+t*0.1;でやったところ最初は追い越し弾になるのですが、
後々統一性がなくなってしまいました。

1発目 一定のスピード
2発目 1発目を追い越すスピード
3発目 2発目を追い越すスピード
4発目 3発目を追い越すスピード
5発目 2発目と同じスピード
6発目 5発目を追い越すスピード
7発目 6発目を追い越すスピード
8発目 2発目と同じスピード
9発目 8発目を追い越すスピード

こんな感じです。
ご意見よろしくお願いします。

チルチル

Re:弾の速度制限

#7

投稿記事 by チルチル » 15年前

地霊殿EXボスの通常攻撃みたいなのをイメージしているのですが、合っているでしょうか?
発射時の初速が変化するだけで、飛んで行く途中で加速はしないんですよね?

統一性となると

shot[n].bullet[k].spd=1+t*0.1;
これを書いてある場所が気になりますね
登録時と計算時のどっちに書いてありますか?

それからtの中身がどうやって決まっているかも気になります
上のを見る限りは%で元に戻しているように見えますが・・

あとはどんな弾幕が作りたいのかを教えて頂ければ的確な回答ができるかもしれません

スタートメニュー

Re:弾の速度制限

#8

投稿記事 by スタートメニュー » 15年前

チルチルさんご返事ありがとうございます。
書いてある場所などの参照は龍神録60章の敵の弾幕(shotH.ccp)のいじっているだけですので…。
ちなみに今は作りたい弾幕は別にないです。
というのも、まだ全然
shot[n].bullet[k].knd
shot[n].bullet[k].angle
shot[n].bullet[k].flag
shot[n].bullet[k].x
shot[n].bullet[k].y
shot[n].bullet[k].col
shot[n].bullet[k].cnt
shot[n].bullet[k].spd
とか
(t>=0 && t<100 && t%5==0)
(int i=0;i<15;i++)
base_angle[0]
などを理解できていないので今は各種をいじって結果どうなるかなどを確認しつつ学んでいます。

それで全方向弾幕やnWAY弾や追い越し弾などを作っている次第です。

チルチル

Re:弾の速度制限

#9

投稿記事 by チルチル » 15年前

あ~なるほどそういう事でしたか

ちなみに後々統一性がなくなる問題は解決したでしょうか?
敵の弾幕程度なら関数を見せていただければ原因がわかると思いますが

あと9発撃っていますが9発で終わる弾幕なのでしょうか?
それとも加速しながら延々と打ち続けるのでしょうか?
もしくは一定周期で速度が戻るのでしょうか?

それから統一性がある状態はどんな動きを期待しているのでしょうか?

Tatu

Re:弾の速度制限

#10

投稿記事 by Tatu » 15年前

添付画像のような感じの弾幕を作りたいのでしょうか?

スタートメニュー

Re:弾の速度制限

#11

投稿記事 by スタートメニュー » 15年前

チルチルさん、Tatuさん
時間が空いてしまって申し訳ないです。

チルチルさんへ
実際は永遠と撃ち続ける設定でしたが、今は下記のとおりになっておりしっかり追い越し弾に
なってくれているみたいです。(回転がかかっており確認しづらいかもしれません。)

もしかしたら永遠と撃つことに問題があったのでしょうか。
void shot_bullet_H000(int n){
	int t=shot[n].cnt;
	int k;
	if(t>=0 && t<100 && t%5==0){
		double angle=shotatan2(n);
		for(int i=0;i<15;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
				shot[n].bullet[k].knd	=8;
				shot[n].bullet[k].angle	=boss_shot.base_angle[0]+PI2/15*i+t;
				shot[n].bullet[k].flag	=1;
				shot[n].bullet[k].x		=enemy[shot[n].num].x;
				shot[n].bullet[k].y		=enemy[shot[n].num].y;
				shot[n].bullet[k].col	=0;
				shot[n].bullet[k].cnt	=1;
				shot[n].bullet[k].spd	=3+t*0.035;
				se_flag[0]=1;
			}
		}
	}
	if(t>=0 && t<100 && t%5==0){
		double angle=shotatan2(n);
		for(int i=0;i<15;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
				shot[n].bullet[k].knd	=8;
				shot[n].bullet[k].angle	=boss_shot.base_angle[0]+PI2/15*i-t;
				shot[n].bullet[k].flag	=1;
				shot[n].bullet[k].x		=enemy[shot[n].num].x;
				shot[n].bullet[k].y		=enemy[shot[n].num].y;
				shot[n].bullet[k].col	=1;
				shot[n].bullet[k].cnt	=1;
				shot[n].bullet[k].spd	=3+t*0.035;
				se_flag[0]=1;
			}
		}
	}
	for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
        if(shot[n].bullet.flag>0){//登録されている弾があれば
            int state=shot[n].bullet.state;
            int cnt=shot[n].bullet.cnt;
            if(10<cnt && cnt<120){//30~120カウントなら
                shot[n].bullet.spd-=1.2/90.0;//90カウントかけて1.2減らす
                shot[n].bullet.angle+=(PI/2)/27.0*(state?-1:1);//90カウントかけて90°傾ける
            }
        }
    }
}


Tatuさんへ
それは鍵型追い越し弾でしょうか?
そのような感じの弾幕も作ってみたいです。
もしよろしければ教えてください。

スタートメニュー

Re:弾の速度制限

#12

投稿記事 by スタートメニュー » 15年前

すいません、ひとつ質問忘れてました。
shot[n].bullet[k].angle =
についてなんですが。
ただ単に敵のいる位置から真下に弾を出させる場合どう書いたらいいでしょうか。
10とか20とか試したのですが、少し変えるだけで全然違う方向に撃つので、
規則性がわかりません。

ご意見お願いいたします。

softya

Re:弾の速度制限

#13

投稿記事 by softya » 15年前

angleの数値の意味を理解されていないと思います。
角度ではありますが、ラジアン(弧度法)角です。
http://www.s-yamaga.jp/nanimono/sonota/kodoho.htm
度数法のつもりで数値を入れてもうまく動きませんよ。
1度=π/180ラジアンです。

スタートメニュー

Re:弾の速度制限

#14

投稿記事 by スタートメニュー » 15年前

ラジアンでしたか。
ありがとうございました。

Tatu

Re:弾の速度制限

#15

投稿記事 by Tatu » 15年前

かぎ型追い越し弾のコードです。
投稿されたコードからの変更は以下の通りです。
1.見た目がわかりやすいように二色ある弾のうち一色のみをうつようにした
2.弾が曲がらないようにした
3.スピードを変更
後ろに前のレスの添付画像のコードをのせます。

void shot_bullet_H000(int n){
	int t=shot[n].cnt;
	int k;
	if(t==0){
		shot[n].base_angle[0]=shotatan2(n);
	}
	if(t>=0 && t<100 && t%5==0){
		for(int i=0;i<15;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
				shot[n].bullet[k].knd	=8;
				shot[n].bullet[k].angle	=shot[n].base_angle[0]+PI2/15*i+t;
				shot[n].bullet[k].flag	=1;
				shot[n].bullet[k].x		=enemy[shot[n].num].x;
				shot[n].bullet[k].y		=enemy[shot[n].num].y;
				shot[n].bullet[k].col	=0;
				shot[n].bullet[k].cnt	=1;
				shot[n].bullet[k].spd	=1+t*0.035;
				se_flag[0]=1;
			}
		}
	}
}

前のレスの添付画像の弾幕

/*
弾発射関数
way個のknd番目の種類のcol番目の色の弾を座標(x,y)からb_angleの方向を中心に発射角度をそれぞれd_angleだけずらし、
速度をspd,状態をstateにしてとばす。この弾はtillまで画面外に出ても消えず、
effが1ならば加算ブレンドして描画され、sflagが1ならば発射音がなる。
*/
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_bulletT106(){
	int i,t=boss_shot.cnt%300;
	if(t==0){
		boss_shot.base_angle[0]=bossatan2()+PI/8;//基準となる角度をセットする
		boss_shot.base_spd[0]=1.0;//発射スピードを戻す
	}
	if(t>=0 && t<80){
		if(t%4==0) boss_bullet_on(8,6,1,boss.x,boss.y,boss_shot.base_angle[0],PI2/8,boss_shot.base_spd[0],0,0);
		boss_shot.base_angle[0]+=PI/4 /80;//発射角度を時計まわりに動かす
		boss_shot.base_spd[0]+=4.0/80;//発射スピードを上げる
	}
	if(t==100){
		boss_shot.base_angle[0]=bossatan2()-PI/8;//基準となる角度をセットする
		boss_shot.base_spd[0]=1.0;//発射スピードを戻す
	}
	if(t>=100 && t<180){
		if(t%4==0) boss_bullet_on(8,6,1,boss.x,boss.y,boss_shot.base_angle[0],PI2/8,boss_shot.base_spd[0],0,0);
		boss_shot.base_angle[0]-=PI/4 /80;//発射角度を反時計まわりに動かす
		boss_shot.base_spd[0]+=4.0/80;//発射スピードを上げる
	}
	if(t==200){
		//50個の弾をばらばらな速度、方向にとばす
		for(i=0;i<50;i++){
			boss_bullet_on(1,7,1,boss.x,boss.y,PI/2+rang(PI),0,3+rang(1),0,0);
		}
		//ボスをランダムに移動させる
		move_boss_pos(64,64,FMX-64,FMY/2-32,50,60);
	}
}

星映

Re:弾の速度制限

#16

投稿記事 by 星映 » 15年前

はじめまして。

自分は現在東方弾幕シューティング作ってる者です。
掲示板内では問題は解決しているようですが一つ気になった
部分があったので記載しておきますね。
(はっきり言ってどうでもいいかもしれませんが)

>shot[n].bullet[k].spd =t*0.1>1;
気になったのはこの式がなぜ1未満のとき動かないかです。
既に分かったことならば大変失礼な内容になってしまいますが、
t*0.1>1の部分は判定式ですので、t*0.1が1以上でなければ当然falseを返します。
falseはint型等で0になるため動かなくなります。

スタートメニュー

Re:弾の速度制限

#17

投稿記事 by スタートメニュー » 15年前

Tatuさん星映さん
ご返事頂いたのに返事が遅くなって申し訳ございません。
インフルエンザにかかってしまった次第です。

Tatuさん
わざわざコードを載せてもらいありがとうございます。
これで作れる弾幕がまた広がりました。

星映さん
原因の理由がわかりました。ありがとうございます。

閉鎖

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