トップページ > 記事閲覧
BGMが発生すると動きが遅くなったり、止まる。
名前:マーク42 日時: 2020/03/24 16:03

BGMが発生すると動きが遅くなったり、止まるのですが、管理人様や皆様はどうやってBGMを使用しているのでしょうか。 全体のプログラムのtalk.hの if (talk == 2) { mark = 1; if (start > 0 && ++start <= 150) { DrawFormatString(300, 300, RED, "battle startします"); syokiiti();// enemymovelock = 1;//この間は敵が動かないようにenemymovelockを1にしたplayer2.hの敵の攻撃や移動の部分より //キーAを押してもAがtalkが増えないように書いた。Player_Update()はSeen = 1により呼ばれるのでtalkの値に関係がないように書いたのでtalkの値に関係ない。なのでtalkが上がってもif (start == 200)により戦闘画面は出てこない。 sound3 = LoadSoundMem("game_maoudamashii_1_battle35.mp3"); PlaySoundMem(sound3, DX_PLAYTYPE_NORMAL); } } にgame_maoudamashii_1_battle35.mp3という戦闘BGMを入れました。 会話を進んだ後、game startと文字が出ながらBGMが流れるように書いたのですが、実際はgame startと表示される手前の会話が表示されたままでBGMが流れます。 ボタンを押しても何も変化なく、BGMが流れっぱなしになります。 以下は全体のファイルです。 //pr4.work/0/BGMproject
メンテ

Page: 1 |

Re: BGMが発生すると動きが遅くなったり、止まる。 ( No.1 )
名前:sereparu 日時:2020/03/24 21:36

全体のプログラムは読めていないので、間違った回答をしてしまっていたらすみません。 > BGMが発生すると動きが遅くなったり、止まるのですが LoadSoundMem と PlaySoundMem が実行され続けて遅くなっているのではないでしょうか? 上記のコードを見る限り、「start」という変数が 1 から 150 になるまで、毎回 LoadSoundMem と PlaySoundMem が実行され続けるように見えます。 LoadSoundMem と PlaySoundMem は、BGMを流したいタイミングで1回だけ実行すれば、あとはBGMは流れ続けるので たとえば「start == 1」のときだけ1回実行すれば良いと思います。 > ボタンを押しても何も変化なく、BGMが流れっぱなしになります PlaySoundMem の2番目の引数(再生形式)が「DX_PLAYTYPE_NORMAL」になっていることが原因だと思います。 「DX_PLAYTYPE_NORMAL」(ノーマル再生)を指定した場合、BGMが再生されている間、処理が止まってしまいます。 「DX_PLAYTYPE_BACK」(バックグラウンド再生)を指定すれば、BGMが再生されたまま処理を進めることができます。 再生形式については、PlaySoundMem のリファレンスにも説明がありますので 質問される前に一度リファレンスを確認する習慣を身に着けると良いと思います。 例えば、私は質問する前に「リファレンスを確認したか」「過去に同じ質問がないか」などチェックシートをつけて すべてチェックしても分からない場合に限り質問するようにしています。 そうすると、ほとんどは質問する前に正解が見つかります。 質問の回数を減らせれば、回答が来るまで作業が止まってしまう、というような無駄な時間を減らせます。 私は今までこの掲示板で質問ばかりしていましたが 最近は、この掲示板に貢献できればという思いで、質問に回答することも始めました。 ただ、私自身もプログラミングにそれほど自信があるわけではないので、簡単に回答できるものしか答えていない段階です。 なので、私が回答しているということは、調べればすぐ分かる初歩的な質問なんだな、ということを意識していただきたいです。 また、今回の質問とは別件ですが、前回の「コントローラの振動に関して。」という質問で 私が間違った内容の回答をしてしまっていたので、訂正の回答を追記しました。 もし、まだ確認されていなければ、一度ご確認をお願いします。
メンテ
Re: BGMが発生すると動きが遅くなったり、止まる。 ( No.2 )
名前:マーク42 日時:2020/03/25 15:13

ご親切にどうもありがとうございます。 >> > BGMが発生すると動きが遅くなったり、止まるのですが LoadSoundMem と PlaySoundMem が実行され続けて遅くなっているのではないでしょうか? 上記のコードを見る限り、「start」という変数が 1 から 150 になるまで、毎回 LoadSoundMem と PlaySoundMem が実行され続けるように見えます。 LoadSoundMem と PlaySoundMem は、BGMを流したいタイミングで1回だけ実行すれば、あとはBGMは流れ続けるので たとえば「start == 1」のときだけ1回実行すれば良いと思います。 とのご意見をいただき、 以下のように編集しました。 if (talk == 2) { mark = 1;         BGMstart1 = 1; if (start > 0 && ++start <= 150) { DrawFormatString(300, 300, RED, "battle startします"); syokiiti();// enemymovelock = 1;//この間は敵が動かないようにenemymovelockを1にしたplayer2.hの敵の攻撃や移動の部分より //キーAを押してもAがtalkが増えないように書いた。Player_Update()はSeen = 1により呼ばれるのでtalkの値に関係がないように書いたのでtalkの値に関係ない。なのでtalkが上がってもif (start == 200)により戦闘画面は出てこない。 } } if (BGMstart1==1) { sound3 = LoadSoundMem("game_maoudamashii_1_battle35.mp3"); PlaySoundMem(sound3, DX_PLAYTYPE_BACK); } としました。 BGMstart1という変数を新しく作り、talkが2になったときにBGMstart1の値が1になり、if (BGMstart1==1) が働くように書いたのですが、 なぜか今まで同様に音がダブって聞こえ、かつ処理が重くなります。 (ちなみに、ほかのタイトルでの音や、戦闘中などの銃声音などは 教えていただいた「DX_PLAYTYPE_BACK」に変更したことで処理が遅れることなくスムーズになりました。sound3に関しても同じように扱ったつもりなのですが、 先ほど書いたように音が何重にもダブって聞こえ、かつ処理が重くなります) どうもありがとうございます。
メンテ
Re: BGMが発生すると動きが遅くなったり、止まる。 ( No.3 )
名前:でぃあぶろ 日時:2020/03/25 16:23

if (talk == 2) {〜〜}でBGMstart1が1になりっぱなしなので, LoadSoundMem()とPlaySoundMem()がループごとに呼び出されているのではないでしょうか. 呼び出すのは1度きりにするようにしてみてはいかがでしょうか. #インデントにびっくりします
メンテ
Re: BGMが発生すると動きが遅くなったり、止まる。 ( No.4 )
名前:sereparu 日時:2020/03/25 19:01

> なぜか今まで同様に音がダブって聞こえ、かつ処理が重くなります。 LoadSoundMem と PlaySoundMem が繰り返し実行されている状態が解消されていないままだと思われます。 おそらく、私が書いた「「start == 1」のときだけ1回実行すれば良い」という部分だけを読んで 「BGMstart1==1」と書いたのだと思いますが、「start == 1」というのはあくまで1つの方法であり目的ではありません。 適当に変数を作って、その変数を「1」と比較すればいい、というわけではありません。 今回の目的は、でぃあぶろさんも書かれているように「呼び出すのは1度きり」にすることです。 「「start == 1」のときだけ1回実行すれば良い」と書いたのは、コード内に 「++start」があったので、「start」という変数が「1」からすぐに別の値になり 「start == 1」が真になるのはループ中1回だけになるので 結果的に LoadSoundMem と PlaySoundMem の呼び出しが1回だけになるのでは、と考えたからです。 値が常に固定の「BGMstart1」を「1」と比較しても、何の意味もありません。 私が「start == 1」という中途半端な例を出してしまったために、勘違いさせてしまい申し訳ありません。 なので、他に方法はいくらでも思いつきますが、具体的な方法は書かないことにします。 とりあえず、VisualStudio をお使いのようなので、一度デバッグビルドでプログラムを実行して ブレークポイントを使うなどして、どのタイミングでどの処理が動いているのかを把握してみると良いと思います。 そうすれば、上記コードの LoadSoundMem や PlaySoundMem が 1回だけ実行されているのか、繰り返し実行されているのか目で見て理解できます。 デバッグビルドやブレークポイントの使い方は、ご自身で調べてください。 今回の件は、PlaySoundMem の使い方以外は、DXライブラリとは直接関係がなく マーク42さんのロジックの書き方の問題です。 別の質問にも書きましたが、ここはDXライブラリの掲示板なので DXライブラリの範囲外のことは、できるだけ自力で解決していただきたいです。 なので、申し訳ありませんが、今回の質問については、私はこれ以上の回答を控えます。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存