ページ 11

PlaySoundMemでBGMが輪唱されてしまう

Posted: 2016年12月06日(火) 23:48
by LEMO
また質問ごめんなさい
タイトル画面にBGMをつけようと
LoadSoundMemでロードしてPlaySoundMemで流しています

コード:

void Title() {
	int GH[10];
	int MainSound;
	GH[0] = LoadGraph("image/title.jpg");
	MainSound = LoadSoundMem("Sound/TS/title.ogg");

	DrawString(0, 0, "メニュー画面です。", GetColor(255, 255, 255));
	DrawGraph(0, 0, GH[0], TRUE);
	PlaySoundMem(MainSound, DX_PLAYTYPE_LOOP);

}
全体の一部です↑
ですが、これで流すと輪唱みたいになってしまいます
一回だけ流す、そしてそれが終わったらまた流す
というのはできませんか?


追記
if(!CheckSoundMem(MainSound)) PlaySoundMem(MainSound);
という文を入れてみてもだめでした....
やりたかったことは、音楽が流れているかチェックして、流れてなかったら実行、です

Re: PlaySoundMemでBGMが輪唱されてしまう

Posted: 2016年12月07日(水) 00:10
by みけCAT
LEMO さんが書きました:一回だけ流す、そしてそれが終わったらまた流す
というのはできませんか?
DX_PLAYTYPE_LOOPを使えばやってくれるはずです。
宣言 int PlaySoundFile( char *FileName , int PlayType ) ;

(中略)

DX_PLAYTYPE_LOOP  : ループ再生

(中略)

ループ再生はバックグラウンド再生+ループ再生で、音楽の再生が 終るとすぐ最初から再生が始まります。
(http://dxlib.o.oo7.jp/function/dxfunc_sound.html#R8N1)
LEMO さんが書きました:追記
if(!CheckSoundMem(MainSound)) PlaySoundMem(MainSound);
という文を入れてみてもだめでした....
やりたかったことは、音楽が流れているかチェックして、流れてなかったら実行、です
Title関数をどのように呼び出しているかがわかりませんが、
毎フレーム音楽をロードして新しい音楽を再生している、ということでしょうか

[hr]
「タイトル」の関数1個しか作らないのではなく、以下のような関数を作って適切なタイミングで呼び出すといいと思います。

●「タイトルの初期化」関数
ゲーム開始(最初の画面に遷移する)前に1度だけ呼び出す。
画像や音声のロードを行う。

●「タイトル突入」関数
タイトル画面に遷移する直前または遷移した直後に1度呼び出す。
状態(実装するなら、選択されている選択肢のIDなど)の初期化や、BGMの再生開始を行う。

●「タイトル処理」関数
タイトル画面にいる間毎フレーム呼び出す。
描画や操作などの処理を行う。
さらに「状態の更新」と「描画」に分けると、さらにいいかもしれません。

Re: PlaySoundMemでBGMが輪唱されてしまう

Posted: 2016年12月07日(水) 23:05
by LEMO
ありがとうございます
挑戦してみます!