弾幕の作成について…

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

弾幕の作成について…

#1

投稿記事 by 燐子 » 14年前

void boss_shot_bulletH003()
{
#define TM003 350
int i,k,t=boss_shot.cnt%TM003,t2=boss_shot.cnt;

if(t2==0)//フラッシュ
{
flash.flag=1;
flash.knd=1;
flash.to_cnt=60;
flash.cnt=0;
}
if(t==0)//目印の弾
{
for(i=0;i<32;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = boss.x;
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 9;
boss_shot.bullet[k].angle = +PI2/32*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 4;
}
}
}
if(t==300)//フラッシュ
{
flash.flag=1;
flash.knd=1;
flash.to_cnt=100;
flash.cnt=0;
}
if(300<t && t<305 && t%1==0 )//大弾
{
for(i=0;i<32;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = boss.x;
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 0;
boss_shot.bullet[k].angle =[A]+PI2/32*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 10;
}
}
}
}//終了

燐子

Re: 弾幕の作成について…

#2

投稿記事 by 燐子 » 14年前

文書き忘れました。すいません

どういう弾幕(スペル)を作りたいかと言うと、
まず、自機中心の弾を32方向の円形に発射し、
その起動と同じ起動に大弾を発射する感じです。


~最初略~

if(t==0)//目印の弾
{
for(i=0;i<32;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = boss.x;
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 9;
boss_shot.bullet[k].angle = [A]+PI2/32*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 4;
}
}
}

~中盤略~

if(300<t && t<305 && t%1==0 )//大弾
{
for(i=0;i<32;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = boss.x;
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 0;
boss_shot.bullet[k].angle =[A]+PI2/32*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 10;
}
}
}

この二つの[A]の部分に何と入力すればできるでしょうか
boss_shot.bullet[k].angle の部分です
できれば教えてもらえませんか、お願いします
アドバイスなどももらえればうれしいです

アバター
nullptr
記事: 239
登録日時: 14年前

Re: 弾幕の作成について…

#3

投稿記事 by nullptr » 14年前

えーと、よみにくくて読んで無いのでちょっと分からないんですが。
アドバイスってことでひとつ、「ちゃんとインデントしましょう」。
インデントは大事ですよ。

あとアングルはラジアンを使うのですがそういうのとかはわかってらっしゃいますでしょうか?
http://dixq.net/rp/14.html
とかをもういちど呼んでみたりいてみてください(ここにはラジアンの説明は無いですがshotatan2()が使われてるので参考になるかも
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

jay
記事: 314
登録日時: 15年前
住所: 大阪市
連絡を取る:

Re: 弾幕の作成について…

#4

投稿記事 by jay » 14年前

フォーラムルールに書いてありますが
ここの掲示板ではコードを張り付けるときは原則としてcodeタグで囲んでくださいね
最低限のルールなのでよろしくお願いします

囲んでみました

コード:

if(t==0)//目印の弾
{
for(i=0;i<32;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = boss.x;
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 9;
boss_shot.bullet[k].angle = [A]+PI2/32*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 4;
}
}
}

~中盤略~

if(300<t && t<305 && t%1==0 )//大弾 
{
for(i=0;i<32;i++)
{
if((k=search_boss_shot())!=-1)
{
boss_shot.bullet[k].col = 2;
boss_shot.bullet[k].x = boss.x;
boss_shot.bullet[k].y = boss.y;
boss_shot.bullet[k].knd = 0;
boss_shot.bullet[k].angle =[A]+PI2/32*i;
boss_shot.bullet[k].flag = 1;
boss_shot.bullet[k].cnt = 0;
boss_shot.bullet[k].spd = 10;
}
}
}
今更囲んでみてもインデント解除されてるのでアレですけど・・・


で、質問の回答については”ボスから見た自機の角度”を入れればいいのですが
恐らくloweさんがおっしゃっているリンク先を参照すれば分かると思います
♪僕たちは まだ森の中 抜け出そう 陽のあたる場所へ

燐子
記事: 7
登録日時: 14年前
住所: 千葉県

Re: 弾幕の作成について…

#5

投稿記事 by 燐子 » 14年前

loweさん、jayさん、すいませんでした…囲ったものを書いておきます。

見様見真似でshotatan2関数とやらを使ってみましたが、
どうしても角度を決める弾と大弾の位置がずれます…
「角度を決める弾と5つの大弾をそれぞれ、発射される時に自機がいた方向に発射する」のではなく、
「角度を決める弾が発射される時に自機がいた方向と同じ方向に5つの大弾も発射する」ようにしたいのです。
方法を教えてください。お願いします。

>ソフト屋さん
すいません。手直ししておきました。
只今いろいろと試してみています。

コード:

void boss_shot_bulletH003()
{
	#define TM003 350
    int i,k,t=boss_shot.cnt%TM003,t2=boss_shot.cnt;
    double angle;
    angle=bossatan2();

	if(t2==0)//フラッシュ
	{
		flash.flag=1;
		flash.knd=1;
		flash.to_cnt=60;
		flash.cnt=0;
	}
	if(t==0)//角度を決める弾
	{
		for(i=0;i<32;i++)
		{
			if((k=search_boss_shot())!=-1)
			{
				boss_shot.bullet[k].col   = 2;
				boss_shot.bullet[k].x     = boss.x;
				boss_shot.bullet[k].y     = boss.y;
				boss_shot.bullet[k].knd   = 9;
				boss_shot.bullet[k].angle = angle+PI2/32*i;
				boss_shot.bullet[k].flag  = 1;
				boss_shot.bullet[k].cnt   = 0;
				boss_shot.bullet[k].spd   = 4;
			}
		}
	}
	if(t==300)//フラッシュ
	{
		flash.flag=1;
		flash.knd=1;
		flash.to_cnt=100;
		flash.cnt=0;
	}
	if(300<t && t<305 && t%1==0 )//大弾 
	{
		for(i=0;i<32;i++)
		{
			if((k=search_boss_shot())!=-1)
			{
				boss_shot.bullet[k].col   = 2;
				boss_shot.bullet[k].x     = boss.x;
				boss_shot.bullet[k].y     = boss.y;
				boss_shot.bullet[k].knd   = 0;
				boss_shot.bullet[k].angle = angle+PI2/32*i;
				boss_shot.bullet[k].flag  = 1;
				boss_shot.bullet[k].cnt   = 0;
				boss_shot.bullet[k].spd   = 10;
			}
		}
	}
}
最後に編集したユーザー 燐子 on 2012年1月31日(火) 19:09 [ 編集 1 回目 ]

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

Re: 弾幕の作成について…

#6

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

インデントは正確にお願いします。
読みづらいのもありますがバグの原因と成ることが多いのです。

「投稿前チェックリスト(beatleさん作成)」 ← チェック3を御覧ください。
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

問題点ですが、「角度を決める弾」と「大弾」を同じ方向に発射したいなら「角度を決める弾」発射時にboss_shotの構造体などにangleを保存しておいて「大弾」は保存しておいたangleを使う必要があります。こうすれば同じ方向に発射できますが理屈はわかりますか?なぜズレのかをよく考えてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

燐子
記事: 7
登録日時: 14年前
住所: 千葉県

Re: 弾幕の作成について…

#7

投稿記事 by 燐子 » 14年前

>ソフト屋さん
あなたのアドバイスと恋の迷路の弾幕を参考にしたらできました!
もっと簡単な作り方があるかもしれませんが、私なりに満足する弾幕になりました

loweさん、jayさん、ソフト屋さん
ありがとうございました!m(_ _)m

完成したもの

コード:


void boss_shot_bulletH000()
{
	#define TM000 250
    int i,k,t=boss_shot.cnt%TM000,t2=boss_shot.cnt;
    double angle;

	if(t2==0)//フラッシュ
	{
		flash.flag=1;
		flash.knd=1;
		flash.to_cnt=60;
		flash.cnt=0;
	}
	if(t==0)//角度を決める弾
	{
		for(i=0;i<32;i++)
		{
			if((k=search_boss_shot())!=-1)
			{
				boss_shot.bullet[k].col   = 2;
				boss_shot.bullet[k].x     = boss.x;
				boss_shot.bullet[k].y     = boss.y;
				boss_shot.bullet[k].knd   = 9;
				boss_shot.bullet[k].angle = bossatan2()+PI2/32*i;
				boss_shot.bullet[k].flag  = 1;
				boss_shot.bullet[k].cnt   = 0;
				boss_shot.bullet[k].spd   = 4;
				se_flag[0]=1;
			}
		}
	}

	if(t==0)//自機の角度を記憶
		boss_shot.base_angle[0]=bossatan2();
	{
		if(t==200)//フラッシュ
		{
			flash.flag=1;
			flash.knd=1;
			flash.to_cnt=100;
			flash.cnt=0;
		}
		if(200<t && t<220 && t%2==0 )//大弾 10発
		{
			for(i=0;i<32;i++)
			{
				if((k=search_boss_shot())!=-1)
				{
					boss_shot.bullet[k].col   = 2;
					boss_shot.bullet[k].x     = boss.x;
					boss_shot.bullet[k].y     = boss.y;
					boss_shot.bullet[k].knd   = 0;
					boss_shot.bullet[k].angle = boss_shot.base_angle[0]+PI2/32*i;
					boss_shot.bullet[k].flag  = 1;
					boss_shot.bullet[k].cnt   = 0;
					boss_shot.bullet[k].spd   = 10;
					se_flag[0]=1;
				}
			}
		}

	}
}//終了

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 弾幕の作成について…

#8

投稿記事 by beatle » 14年前

ちなみにですが,#defineは関数などの構造をまったく感知しませんのでご注意ください.
#defineを関数の中に書いたとしても,関数の終端を超えてファイルの終端まで有効になるということです.

燐子
記事: 7
登録日時: 14年前
住所: 千葉県

Re: 弾幕の作成について…

#9

投稿記事 by 燐子 » 14年前

>beatleさん
わざわざありがとうございます!m(_ _)m
つまり、ファイルの最後までTM000の値は250ってことですか?
他の弾幕データではTM001などと変えていけば大丈夫ですよね?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 弾幕の作成について…

#10

投稿記事 by beatle » 14年前

燐子 さんが書きました:つまり、ファイルの最後までTM000の値は250ってことですか?
その通りです.#defineで定義された行の次の行からファイルの終端までが,その定義の有効範囲です.
燐子 さんが書きました:他の弾幕データではTM001などと変えていけば大丈夫ですよね?
そうですね.ふつうは,#defineはファイルの上の方でまとめて書きます.

コード:

#define TM000 250
#define TM001 300

void boss_shot_bulletH000()
{
    ...
}

void boss_shot_bulletH001()
{
    ...
}
という感じに.

燐子
記事: 7
登録日時: 14年前
住所: 千葉県

Re: 弾幕の作成について…

#11

投稿記事 by 燐子 » 14年前

わかりました( ´∀`)
これからは注意して書くようにします!

閉鎖

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