弾幕について

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

弾幕について

#1

投稿記事 by no » 15年前

こんにちは。
現在弾幕をいくつか作成しておりまして、おおまかに理解することが出来ました。
そこでひとつ疑問に思ったんですが、各段幕を組合わせるにはどうすればよいのでしょう。

たとえば、
void EnemyShotPattern3(){
     for(int j=0;j<10;j++){//計10発撃つ
         if(EnemyShot.counter==20*j){
            EnemyShot.EnemyShots[j].flag=1;
            EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;//敵の現在のx座標を記憶
            EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;//敵の現在のy座標を記憶
            EnemyShot.Angle[j]=atan2(EnemyShot.mem_py -EnemyShot.mem_ey ,EnemyShot.mem_px - EnemyShot.mem_ex);//角度を習得
         }
     }
     EnemyShot.EnemyShots[j].x += 1*cos(EnemyShot.Angle[j]);//cosがx座標の移動数値
     EnemyShot.EnemyShots[j].y += 1*sin(EnemyShot.Angle[j]);//sinがy座標の移動数値
}


上記のような弾幕は敵座標と自座標の座標位置を求め、atan2関数で角度を導出し、
sin,cosに当てはめることで弾のx,yの移動量を加えています。

この弾幕が終了した後、まったく同じ弾幕をうたせようとしました。
正直同じ関数を使い廻せばいいだけの話ですが、今後の発展のため、EnemyShotPattern3関数のみで
実装したいです。

自分なりに考えてみたのは以下のコードです。
しかしながら、後者がおそらく反応していません。
問題点、もしくは手法など教授お願いします。


void EnemyShotPattern3(){
     for(int j=0;j<10;j++){//計10発撃つ
         if(EnemyShot.counter==20*j){
            EnemyShot.EnemyShots[j].flag=1;
            EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;//敵の現在のx座標を記憶
            EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;//敵の現在のy座標を記憶
            EnemyShot.Angle[j]=atan2(EnemyShot.mem_py - EnemyShot.mem_ey ,EnemyShot.mem_px - EnemyShot.mem_ex);//角度を習得
         }
     }
     for(j=10;j<20;j++){
         if(EnemyShot.counter==20*j){
             EnemyShot.EnemyShots[j].flag=1;
             EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;//敵の現在のx座標を記憶
             EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;//敵の現在のy座標を記憶
             EnemyShot.Angle[j]=atan2(EnemyShot.mem_py -EnemyShot.mem_ey ,EnemyShot.mem_px - EnemyShot.mem_ex);//角度を習得
         }
     }
         EnemyShot.EnemyShots[j].x += 1*cos(EnemyShot.Angle[j]);//x座標の移動量
         EnemyShot.EnemyShots[j].y += 1*sin(EnemyShot.Angle[j]);//y座標の移動量
}
画像

jay

Re:弾幕について

#2

投稿記事 by jay » 15年前

これは、おそらくとしか言えませんが・・・

if(EnemyShot.counter==20*j){
と言うことは20カウント起きに弾を出す、と言うことですね。

しかし前半も後半も
if(EnemyShot.counter==20*j){
になっているので、全く同時に弾を出しているのではないかと思います。

つまり、後半の”EnemyShot.counter==20*j”の値を修正すればいいと思います。

Tatu

Re:弾幕について

#3

投稿記事 by Tatu » 15年前

シューティングゲームの館のコードですね。

コンパイルエラーは出なかったのですか?

あなたの書き方では「先に発射された10発は問題なく動いている」と
いうように読めますがどうなのですか?

また、プログラムの作成に何を使用していますか?

回答の前に書いておきます。

シューティングゲームの館のトップに
「効率的、汎用的、拡張的であるよりも
わかりやすいことを重視している」と書いてあるが
「本格的なゲーム制作には向きません」とも書いてあり、
それ以降の弾幕関数に関しては龍神録プログラミングの館よりも
わかりにくく、面倒なものとなっていくので
だいたいわかったのならば、龍神録プログラミングの館を
見ることをお勧めします。





では、投稿されたコードがうまく動かない理由を書きます。

一回目のfor文ではjが宣言されていますが、
このjはこのfor文の中だけでしか使えません。

しかも弾の座標を動かす処理が
for文の中に入っておらず、
撃った後弾が動かないようになっています。

よって、動くようにするには
二回目のfor文でも宣言を行うようにするか
for文の前だけでjを宣言するかして
それぞれのfor文に弾を動かす処理を入れておくか

あるいは一つのfor文にまとめるかしてください。

jay

Re:弾幕について

#4

投稿記事 by jay » 15年前

あっ、ホントですね。
時間がなかったからよくコード読んで無かったです(←アドバイサー失格)
すいません。

手っ取り早いのは
for(int j=0;j<20;j++)

こうすることですね。
弾を動かす処理も必要のようですが。


龍神録の方が色々と充実していてコードも読みやすいので、僕もそちらをオススメしますよ。

no

Re:弾幕について

#5

投稿記事 by no » 15年前

お返事ありがとうございました。
両名の返信の内容を吟味したところ、理由がわかりました。

もう半年以上前の話ではありますが、龍神録のコードが難しかったためシューティングゲームの館をメインで読むことにしたクチです。

しかしながら最近眼で追えるようになってきたので龍神のほうに移るという選択肢もありですね。



まあどちらにせよ、不明な部分が解明したことはありがたいことです。
ありがとうございました。

閉鎖

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