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

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

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

#1

投稿記事 by 敗者 » 11年前

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;
			}
		}
		

}
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 11年前

申し訳ないですが動画が再生できなかったので詳細はわかりませんでした。
勘ですが、shot[n].bullet[k].angle =PI2/20*i;が逆方向に回せば解決するかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#3

投稿記事 by Tatu » 11年前

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

敗者

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

#4

投稿記事 by 敗者 » 11年前

アップロードしなおしました
http://tikuwa.net/file/32288.mp4.html パスワードはaです

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#5

投稿記事 by softya(ソフト屋) » 11年前

動画を見て理解しました。
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の加算が回転方向を決めますので、+を-にしたら逆方向に移動するはずです。たぶん。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

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

#6

投稿記事 by Tatu » 11年前

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

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



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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 11年前

龍神録をコードを隅々まで理解していないのでTatuさんにお任せします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

敗者

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

#8

投稿記事 by 敗者 » 11年前

Tatuさん

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

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

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

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

#9

投稿記事 by Tatu » 11年前

コードはこのようにすればよいでしょう。

コード:

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の弾幕をつくってみているのですが

#10

投稿記事 by 敗者 » 11年前

コードまで書いていただきありがとうございます
switchを使って分岐させる方法があるのですね
初心者の質問に丁寧に答えてていただきありがとうございました

閉鎖

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