トップページ > 過去ログ > 記事閲覧
弾連射が重なる
名前:プログラム初心者 日時: 2010/03/02 21:36

プログラミングの初心者です。 DXライブラリで簡単なシューティングゲームを作成しています。 自機弾の連射がどうしてもうまくできないので質問させていただきます。 弾の連射のソースをDXライブラリのシューティングのサンプル (ttp://homepage2.nifty.com/natupaji/DxLib/lecture/lecture1_4.html) を手本にしてソースを組んでいるのですが、どうやら弾たちが重なってしまうため、1つに見えてしまいます。 下が自分が作成したソースです。 自機のたまに関する部分だけですが。 変数宣言、など 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 //ShotFlagに0を代入する for(i=0;i<msh;i++) { ShotFlag[i]=0; } 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 if(allkey[KEY_INPUT_SPACE]==1) // スペースキーを押していたら弾ループにはいる { for(i=0;i<msh;i++) //弾の数だけ繰り返す { if(ShotFlag[i]==0) //フラグ0なら実行 { // 弾の位置をセット ShotX[i] = mx+16; //自機の目の前に設置 ShotY[i] = my-16; // 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する ShotFlag[i] = 1 ; } } //forループの終わり } //ifループの終わり 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ここは敵関連のソースで弾の処理とは無関係なので省略 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 for(i=0;i<msh;i++) { //ShotFalgが1なら行う if( ShotFlag[i] == 1 ) { // 弾を16ドット上に移動させる ShotY[i] -= 16 ; // 画面外に出てしまった場合はフラグ0 if( ShotY[i] < 40 ) { ShotFlag[i] = 0 ; } //弾の描画 DrawGraph( ShotX[i] , ShotY[i] , ShotGraph , TRUE ) ; } } 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 以下、時間やスコア、表画面処理 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 以上のようになっております。 ShotX[i]、Shot[i]が弾の位置、ShotFlagが弾の存在フラグ、mshが弾の数、です。 弾の描画処理の部分をどうにか直したいのですが、なかなかうまくできませんでした。

Page: 1 |

Re: 弾連射が重なる ( No.1 )
名前:いっち 日時:2010/03/02 22:12

弾の発射判定のループで、空いている"ShotFlag"が見つかった場合にループを終了するようにすれば、 1フレームに1発しか弾を発射しなくなるのではないでしょうか?(サンプルではそのようになっています) 具体的には以下の通りです。 if(allkey[KEY_INPUT_SPACE]==1) // スペースキーを押していたら弾ループにはいる { for(i=0;i<msh;i++) //弾の数だけ繰り返す { if(ShotFlag[i]==0) //フラグ0なら実行 { // 弾の位置をセット ShotX[i] = mx+16; //自機の目の前に設置 ShotY[i] = my-16; // 弾は現時点を持って存在するので、存在状態を保持する変数に1を代入する ShotFlag[i] = 1 ; break; // <- 追加 } } //forループの終わり } //ifループの終わり
Re: 弾連射が重なる ( No.2 )
名前:プログラム初心者 日時:2010/03/03 08:59

ありがとうございます! すごいです!弾が連射されています! サンプルでもきちんと書いてありました・・・。 見落としていました・・・。 たしかにこのようにすれば玉がひとつだけ処理され、別の弾は処理されないので、同じ場所に出現することはないということですね。 すばやい回答と解説ありがとうございました。

Page: 1 |