ページ 11

STGの弾幕をつくってみているのですが

Posted: 2013年2月21日(木) 23:00
by 敗者
http://dixq.net/rp/15.html
http://dixq.net/rp/16.html
を参考にして
http://tikuwa.net/file/32235.avi.html   パスワードはaです
のようなものを作ったのですが
赤いほうの弾を青いほうの弾の逆の向きの軌道で動かすにはどうすればよいのでしょうか
コードはこれです

コード:

void shot_bullet_H008(int n){
    int t=shot[n].cnt,a=shot[n].cnt;
    int k;
    if(t>=0 && t<300 && t%90==0){
        double angle=rang(PI);
        for(int j=0;j<2;j++){
            for(int i=0;i<24;i++){
                if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                    shot[n].bullet[k].knd    =2;
                    shot[n].bullet[k].angle  =angle+PI2/24*i;
                    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    =0;
                    shot[n].bullet[k].state  =j;
                    shot[n].bullet[k].spd    =2;
                    se_flag[0]=1;//発射音鳴らす
                }
            }
        }
	}
		for(int i=0;i<SHOT_BULLET_MAX;i++){
        if(shot[n].bullet[i].flag>0){
            int state=shot[n].bullet[i].state;
            int cnt=shot[n].bullet[i].cnt;
            if(0<cnt && cnt<240){
                shot[n].bullet[i].spd-=2.2/90.0;
                shot[n].bullet[i].angle+=(PI/2)/90.0*(state?-1:1);
            }
        }
    }
	
    	if(a>=0 && a<=150 && a%10==0){
		for(int i=0;i<20;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
				shot[n].bullet[k].knd	=7;
				shot[n].bullet[k].angle	=PI2/20*i;
				shot[n].bullet[k].flag	=1;
				shot[n].bullet[k].x		=enemy[shot[n].num].x+cos(PI/2+PI/150*t)*100;
				shot[n].bullet[k].y		=enemy[shot[n].num].y+sin(PI/2+PI/150*t)*100;
				shot[n].bullet[k].col	=1;
				shot[n].bullet[k].cnt	=0;
				shot[n].bullet[k].spd	=1.2;
			}
		}
		for(int i=0;i<20;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
				shot[n].bullet[k].knd	=7;
				shot[n].bullet[k].angle	=PI2/20*i;
				shot[n].bullet[k].flag	=1;
				shot[n].bullet[k].x		=enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;
				shot[n].bullet[k].y		=enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
				shot[n].bullet[k].col	=0;
				shot[n].bullet[k].cnt	=0;
				shot[n].bullet[k].spd	=1.2;
				se_flag[0]=1;
			}
		}
		

}
}

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 00:53
by softya(ソフト屋)
申し訳ないですが動画が再生できなかったので詳細はわかりませんでした。
勘ですが、shot[n].bullet[k].angle =PI2/20*i;が逆方向に回せば解決するかもしれません。

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 08:30
by Tatu
弾の角度の変化は29行目の
shot[n].bullet.angle+=(PI/2)/90.0*(state?-1:1);
で行っているため、赤い方の弾のstateを0以外にすればいいでしょう。

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 21:21
by 敗者
アップロードしなおしました
http://tikuwa.net/file/32288.mp4.html パスワードはaです

どちらとも初心者の質問すみません

softya(ソフト屋)さん
逆方向に回すというのはどういうことでしょうか?

Tatuさん
34行目以降にはstateが使われていないのですが
赤いほうの弾のstateはどうやってかえればいいのでしょうか?

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 21:34
by softya(ソフト屋)
動画を見て理解しました。
47から57行あたりが赤い弾の処理だと思いますが、
shot[n].bullet[k].x =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;
shot[n].bullet[k].y =enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
のsin/cosの加算が回転方向を決めますので、+を-にしたら逆方向に移動するはずです。たぶん。

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 21:53
by Tatu
softya(ソフト屋)さんの回答のどちらにも意味はありません。
No:2は
shot[n].bullet[k].angle=-PI2/20*i;
にすればいいというつもりなのでしょうが見た目は全く変わりません。

No:5は
弾の発射位置が変わるだけで軌道は変わりません。
この変更では赤と青の弾が完全に重なり、
赤と青の二色を撃つ意味がなくなります。



>赤いほうの弾のstateはどうやってかえればいいのでしょうか?
レーザーのstateはどうやってかえたのでしょうか?

>34行目以降にはstateが使われていないのですが
このように書くということはkndが7である弾が曲がるのは意図していない動作だったのですか?

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 21:56
by softya(ソフト屋)
龍神録をコードを隅々まで理解していないのでTatuさんにお任せします。

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 22:15
by 敗者
Tatuさん

すみませんレーザーのほうのstateも何も変えてません

kndが7の弾が曲がったのは意図していませんでした

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 23:35
by Tatu
コードはこのようにすればよいでしょう。

コード:

void shot_bullet_H008(int n){
	int t=shot[n].cnt;
	int k;

	//レーザー(kndが2の弾)の発射
	if(t>=0 && t<300 && t%90==0){
		double angle=rang(PI);
		for(int j=0;j<2;j++){
			for(int i=0;i<24;i++){
				if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
					shot[n].bullet[k].knd    =2;
					shot[n].bullet[k].angle  =angle+PI2/24*i;
					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    =0;
					shot[n].bullet[k].state  =j;//0であるレーザーと1であるレーザーを発生させる
					shot[n].bullet[k].spd    =2;
					se_flag[0]=1;//発射音鳴らす
				}
			}
		}
	}

	if(t>=0 && t<=150 && t%10==0){
		//赤い弾の発射
		for(int i=0;i<20;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
                shot[n].bullet[k].knd   =7;
				shot[n].bullet[k].angle =PI2/20*i;
				shot[n].bullet[k].flag  =1;
				shot[n].bullet[k].x     =enemy[shot[n].num].x+cos(PI/2+PI/150*t)*100;
				shot[n].bullet[k].y     =enemy[shot[n].num].y+sin(PI/2+PI/150*t)*100;
				shot[n].bullet[k].col   =1;
				shot[n].bullet[k].cnt   =0;
				shot[n].bullet[k].spd   =1.2;
				shot[n].bullet[k].state =2;
			}
		}
		//青い弾の発射
		for(int i=0;i<20;i++){
			if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
				shot[n].bullet[k].knd   =7;
				shot[n].bullet[k].angle =PI2/20*i;
				shot[n].bullet[k].flag  =1;
				shot[n].bullet[k].x     =enemy[shot[n].num].x+cos(PI/2-PI/150*t)*100;
				shot[n].bullet[k].y     =enemy[shot[n].num].y+sin(PI/2-PI/150*t)*100;
				shot[n].bullet[k].col   =0;
				shot[n].bullet[k].cnt   =0;
				shot[n].bullet[k].spd   =1.2;
				shot[n].bullet[k].state =3;
                se_flag[0]=1;
			}
		}
	}

	//弾の制御
	for(int i=0;i<SHOT_BULLET_MAX;i++){
		if(shot[n].bullet[i].flag>0){
			int state=shot[n].bullet[i].state;
			int cnt=shot[n].bullet[i].cnt;
			switch(state){
			case 0://レーザー(時計回り)
				if(0<cnt && cnt<240){
					shot[n].bullet[i].spd-=2.2/90.0;
					shot[n].bullet[i].angle+=(PI/2)/90.0;
				}
				break;
			case 1://レーザー(反時計回り)
				if(0<cnt && cnt<240){
					shot[n].bullet[i].spd-=2.2/90.0;
					shot[n].bullet[i].angle-=(PI/2)/90.0;
				}
				break;
			case 2://赤いkndが7の弾

				break;
			case 3://青いkndが7の弾

				break;
			}
		}
	}
}

Re: STGの弾幕をつくってみているのですが

Posted: 2013年2月23日(土) 23:55
by 敗者
コードまで書いていただきありがとうございます
switchを使って分岐させる方法があるのですね
初心者の質問に丁寧に答えてていただきありがとうございました