こんにちは。N-WAY弾を一括処理してくれるプログラムを組もうとしているのですが、うまくいきません。
具体的には、
1.敵に「敵が放つ弾のWAY数」と「その弾と弾の間の角度」を持たせる。
2.それを元に3way,4way,11wayとどんなway数でも、どんな弾と弾の間の角度でも一括処理してくれるN-WAY処理セクションを作る。(さすにが0WAYなどのナンセンスな値は無視して。)
というものを作ろうと試みていました(2WAY,3WAY,4WAYと個別に作っていくことは大変なので)。
しかし色々やってみれどWAY数は楽に実装できても、
7WAYなのに右から2番目の弾が自機狙いになる、3wayなのに一番右側の弾が自機狙いになる、
などという事態で、三角関数の知識が乏しいため、この辺りが限界でした。
自分以外が読んで把握できるのかはわかりませんが、以下に注釈大めで挑戦の軌跡を書きますので、どなたかアドバイスよろしくお願いします。
(だいたいは、ここの龍神録プログラミングと同じような作りなので、大丈夫だといいのですが……)
略
tempには弾を吐き出す親のインスタンス番号が入っています。
if(enemy[temp].bullet_pattern==201){//敵[temp]の攻撃パターン201のとき = N-Way弾の一括処理
int i,kazu;
int way=enemy[temp].enemy_way;//敵が放つ弾のway数をint wayに代入。
double haba=enemy[temp].enemy_way_haba;//敵が放つ弾と弾の間の角度。なのでhaba
for(kazu=0;kazu<way;kazu++){//WAY数の数だけ繰り返す
for(i=0;i<ENEMY_BULLET_MAX;i++){
if(tama.tama_flag==0 && enemy[temp].enemy_hp>0){//弾のフラグがOFFで敵が生きていれば
tama.tama_flag=1;//弾のフラグON
tama.tama_x=enemy[temp].enemy_x;//親のX座標を代入
tama.tama_y=enemy[temp].enemy_y;//親のY座標を代入
double shotatan2=atan2(chara_y+20-tama.tama_y,chara_x+14-tama.tama_x);//弾と自機の角度 - このサイトお馴染みのshotatan2です
tama.tama_angle=PI2/20/2+PI2/20*kazu*shotatan2;//弾の飛ぶ角度がおかしいのは、多分ここのせい。しかしどう書けばよいのかがわかりません。
//注釈:;敵が放つ弾と弾の間の角度であるdouble habaは、どこで使えばよいのかがわからないので、使われていません。
tama.tama_speed=2;//弾の速度
}
}
}//N-Way弾の一括処理終わり
また、18章-自機ショットに当たり判定をつけてみよう。URL: http://dixq.net/rp/18.html
での当たり判定をDrawBoxやDrawCircleなどで視覚的に見えるようにする方法はないでしょうか。
32*32の敵画像で、何故int enemy_range[ENEMY_RANGE_MAX]={16,30,16,50};
という数字が入ったりするかがまだ僕には難しいので、理解しやすくするためにも視覚的に見ることはできないかなと思いました。
(のちのち、色々な大きさの画像の当たり判定を確認する際にも便利そうですし)
長くなりましたが、どうかよろしくお願いします。
N-WAY弾を一括処理してくれるセクション
Re: N-WAY弾を一括処理してくれるセクション
非常に適当かつ雑更にわかりにくい図で申し訳ないんですが、
弾の間の角度をang、弾数をwayとした場合、
敵と自機の成す角度 atan2( px-ex, py-ey )と一番外側の弾の間の角度は
( way-1 )*ang/2
になります
ですので、コードとしては
となります……なるはずです
動作確認はしていませんし、最適化の余地もあります。
やっつけなので合っているかもわかりませんがこのような感じではないでしょうか
(画像は4wayのつもりですorz)
弾の間の角度をang、弾数をwayとした場合、
敵と自機の成す角度 atan2( px-ex, py-ey )と一番外側の弾の間の角度は
( way-1 )*ang/2
になります
ですので、コードとしては
double EtoP = atan2( px-ex, py-ey );
for( int i=0; i<way; i++ ){
弾の角度 = EtoP-( way-1 )*ang/2+i*ang;
}
動作確認はしていませんし、最適化の余地もあります。
やっつけなので合っているかもわかりませんがこのような感じではないでしょうか
(画像は4wayのつもりですorz)
- 添付ファイル
-
- nway.png (11.69 KiB) 閲覧数: 2973 回
Re: N-WAY弾を一括処理してくれるセクション
ありがとうございます!おかげでN-WAY弾が実装できました。
今まではatanとは結局なんなのだ状態だったので、画像でなんとなく何を計算しているのかがわかり、ためになりました。
画像は保存して(当然、個人的利用の範囲で)、理解を深めたいと思います。
しかし弾と弾の幅がうまくいきません。僕がどこか勘違いしてしまっているのかもしれません。
OLD: tama.tama_angle=PI2/20/2+PI2/20*kazu*EtoP;//元はShotatan2でしたが分かりやすくEtoPで統一です
NEW: tama.tama_angle=EtoP-(way-1)*haba/2+kazu*haba;
と変更させていただいたのですが、
例えば、habaに10が入っていると、弾同士の間隔が10度になる、という設計が思い描いている理想です。
habaに小さい角度を入れるほど、WAY弾も密集し、大きな数字を入れると大きく分散したWAY弾になる、といった感じでしょうか。
今まではatanとは結局なんなのだ状態だったので、画像でなんとなく何を計算しているのかがわかり、ためになりました。
画像は保存して(当然、個人的利用の範囲で)、理解を深めたいと思います。
しかし弾と弾の幅がうまくいきません。僕がどこか勘違いしてしまっているのかもしれません。
OLD: tama.tama_angle=PI2/20/2+PI2/20*kazu*EtoP;//元はShotatan2でしたが分かりやすくEtoPで統一です
NEW: tama.tama_angle=EtoP-(way-1)*haba/2+kazu*haba;
と変更させていただいたのですが、
例えば、habaに10が入っていると、弾同士の間隔が10度になる、という設計が思い描いている理想です。
habaに小さい角度を入れるほど、WAY弾も密集し、大きな数字を入れると大きく分散したWAY弾になる、といった感じでしょうか。
Re: N-WAY弾を一括処理してくれるセクション
失礼しました
atan2は( y, x )でしたね……
どうやら勘違いをしていたようでm(_ _)m
habaに10を入れるとのことでしたが
cの三角関数はラジアン値ですから
10度にはならないと思うのですが……?
atan2は( y, x )でしたね……
どうやら勘違いをしていたようでm(_ _)m
habaに10を入れるとのことでしたが
cの三角関数はラジアン値ですから
10度にはならないと思うのですが……?
Re: N-WAY弾を一括処理してくれるセクション
おお、申し訳ない。まだ知識が飲み込みきれていないのでとんでもないことを言っているようで。
habaにはどんな計算式を入れてやれば、いい塩梅になるのでしょうか。
適当な数値を入れると全方位弾のようになってしまいますよね(Way数は合っていても)。
整理しますと、
・おかげさまでway弾達成!//無事、解決!
・しかしhabaには、一体全体どんな計算式を入れればよいのかがわからない。色々試せど、全く具合がつかめません。//今はここです
といった感じでしょうか。
habaにはどんな計算式を入れてやれば、いい塩梅になるのでしょうか。
適当な数値を入れると全方位弾のようになってしまいますよね(Way数は合っていても)。
整理しますと、
・おかげさまでway弾達成!//無事、解決!
・しかしhabaには、一体全体どんな計算式を入れればよいのかがわからない。色々試せど、全く具合がつかめません。//今はここです
といった感じでしょうか。