弾の速度制限
-
Dixq (管理人)
Re:弾の速度制限
うむむ・・すみません意図がいまいちよく理解出来ていません。
時間がたつにつれてスピードを変化させたいなら、カウンタによってスピードを変化させればいいですね。
セットするスピードもその仰っているスピード以下にならないように計算すればいいのではないでしょうか?
「t*0.1で1以上」という意味がわかりません。
弾幕が始まってからの時間ですか?
>shot[n].bullet[k].spd =t*0.1>1;
>このように書くと1に満たない弾は止まってしまいます。
このような書き方は出来ないと思います(出来ないというよりおそらく思った通りにいかない)
もう少し詳しくわかりやすく、やりたいことを教えて頂けると何かアドバイス出来るかも知れません
時間がたつにつれてスピードを変化させたいなら、カウンタによってスピードを変化させればいいですね。
セットするスピードもその仰っているスピード以下にならないように計算すればいいのではないでしょうか?
「t*0.1で1以上」という意味がわかりません。
弾幕が始まってからの時間ですか?
>shot[n].bullet[k].spd =t*0.1>1;
>このように書くと1に満たない弾は止まってしまいます。
このような書き方は出来ないと思います(出来ないというよりおそらく思った通りにいかない)
もう少し詳しくわかりやすく、やりたいことを教えて頂けると何かアドバイス出来るかも知れません
-
ALFA
Re:弾の速度制限
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になってると思います。
私も始めたばかりなのでこの程度が限界で申し訳ないです。
・弾速が上限の速度に到達していない場合は、弾が射出されてからの時間に対して一定の値で加速して移動
・弾速が上限の速度に到達している場合はそのままの速度で移動
のように条件分岐すればいいのでしょうか……ね。
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:弾の速度制限
皆様色々なご回答本当に感謝いたします。
自分の説明下手で本当に申し訳ございません。
追い越し弾ですね。言葉が見つかりませんでした。
チルチルさんの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発目を追い越すスピード
こんな感じです。
ご意見よろしくお願いします。
自分の説明下手で本当に申し訳ございません。
追い越し弾ですね。言葉が見つかりませんでした。
チルチルさんの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:弾の速度制限
チルチルさんご返事ありがとうございます。
書いてある場所などの参照は龍神録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弾や追い越し弾などを作っている次第です。
書いてある場所などの参照は龍神録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:弾の速度制限
チルチルさん、Tatuさん
時間が空いてしまって申し訳ないです。
チルチルさんへ
実際は永遠と撃ち続ける設定でしたが、今は下記のとおりになっておりしっかり追い越し弾に
なってくれているみたいです。(回転がかかっており確認しづらいかもしれません。)
もしかしたら永遠と撃つことに問題があったのでしょうか。
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さんへ
それは鍵型追い越し弾でしょうか?
そのような感じの弾幕も作ってみたいです。
もしよろしければ教えてください。
-
softya
Re:弾の速度制限
angleの数値の意味を理解されていないと思います。
角度ではありますが、ラジアン(弧度法)角です。
http://www.s-yamaga.jp/nanimono/sonota/kodoho.htm
度数法のつもりで数値を入れてもうまく動きませんよ。
1度=π/180ラジアンです。
角度ではありますが、ラジアン(弧度法)角です。
http://www.s-yamaga.jp/nanimono/sonota/kodoho.htm
度数法のつもりで数値を入れてもうまく動きませんよ。
1度=π/180ラジアンです。
-
Tatu
Re:弾の速度制限
かぎ型追い越し弾のコードです。
投稿されたコードからの変更は以下の通りです。
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);
}
}