弾幕の作成について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
クラバック
記事: 26
登録日時: 14年前
住所: 関東

弾幕の作成について

#1

投稿記事 by クラバック » 14年前

いつもお世話になっております。弾幕の作成が行き詰ってしまったので、質問させて頂きました。

東方プロジェクトのスぺカ「金閣寺の一枚天井」の、天井弾の、水平方向に射出するときの弾の実装が、思うように行きません。
弾幕風のスクリプトを参考にして、spdを9で初期化、以降spd-=8.2/15として15way弾を水平方向に射出するようにしてみたのですが、
この式だと、弾が、突然ピタッと止まってしまい、違和感を覚えます。
本家だと、僅かですが減速し、そして弾速が0になり、それから下(PI/2)の方向に等速で動いているように見えます。
sinの式を0~PI/2の範囲で動かすのかな、と思い、色々試してみましたが、弾の間隔がバラバラになってしまったりと、思ったように実装出来ません。

宜しくお願い致します。

コード:

/*一部省略*/
if(t%30==0){//天井弾の作成。0とPI交互に射出

double spd=9;

		 double x = boss.x + GetRand(40) - 20;
		 double y = boss.y + GetRand(60) - 30; 
		 for(i=0;i<15;i++){
				if((k=search_boss_shot())!=-1){				
					boss_shot.bullet[k].x		= x;
					boss_shot.bullet[k].y		= y;
					boss_shot.bullet[k].angle	= angle;

					boss_shot.bullet[k].spd	= spd;

					boss_shot.bullet[k].knd	= 4;
					boss_shot.bullet[k].col	= 4;
					boss_shot.bullet[k].state	= 1;
					boss_shot.bullet[k].cnt	= 0;
					boss_shot.bullet[k].flag	= 1;
				}
				spd -= 8.2/15;
/*以降プログラム続く*/
		 }

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 弾幕の作成について

#2

投稿記事 by Tatu » 14年前

[nico]http://www.nicovideo.jp/watch/sm15594703[/nico]
弾幕を作ってみましたが天井弾はこんな感じでしょうか?

この天井弾を撃った後の処理は以下のようになっています。

コード:

    for(int i=0;i<BOSS_BULLET_MAX;i++){
        if(boss_shot.bullet[i].flag==1){
            switch(boss_shot.bullet[i].state){
            case 1:
                if(boss_shot.bullet[i].cnt<60){
                    boss_shot.bullet[i].spd-=boss_shot.bullet[i].spd/(60-boss_shot.bullet[i].cnt);
                }
                if(boss_shot.bullet[i].cnt==120){
                    boss_shot.bullet[i].spd=3;
                    boss_shot.bullet[i].angle=PI/2;
                }
                break;
弾幕全体の関数は
こちらの日記(http://dixq.net/forum/blog.php?u=525&b=2328)をご覧ください。
ただし、自作の関数の定義についてはのせていないため、ただコピペしても動きません。

アバター
クラバック
記事: 26
登録日時: 14年前
住所: 関東

Re: 弾幕の作成について

#3

投稿記事 by クラバック » 14年前

お返事遅れました!申し訳ございません。
お蔭様で天井弾を実装できました!有り難うございます!教えていただいた

コード:

 boss_shot.bullet[i].spd-=boss_shot.bullet[i].spd/(60-boss_shot.bullet[i].cnt)
という式を使ってみると、綺麗に滑らかに弾が止まってくれました・・・・・・!助かりました!てっきり三角関数を使うものだとばかり思っていましたが、このような方法もあるんですね・・・・・・!

追記
重ね重ね申し訳ないのですが、解決ボタンってどこにあるのでしょうか・・・?
最後に編集したユーザー クラバック on 2011年9月14日(水) 20:45 [ 編集 1 回目 ]

アバター
Tatu
記事: 445
登録日時: 14年前
住所: 北海道

Re: 弾幕の作成について

#4

投稿記事 by Tatu » 14年前

投稿の横に解決!という赤い文字が横に書いてあるチェックボックスがあるのでそこをクリックして
チェックが入った状態で投稿すればよいです。編集時にもつけることは可能です。

閉鎖

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