音楽の再生について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
田中太郎
記事: 24
登録日時: 13年前

音楽の再生について

#1

投稿記事 by 田中太郎 » 13年前

ゲームのBGMを流そうとしてるのですが上手くいかないので質問させてもらいます。

コード:

//main.cpp

#include "DxLib.h"
#include "../h/load.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

		load_handle();
		
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){

		load_music(1);

	}

		DxLib_End();
		return 0;
	
}

コード:

//load.cpp

#include "DxLib.h"

static int music[10];
static int i;

void load_handle(){
	music[0] = LoadSoundMem( "date/BGM/オープニング.ogg" );
}

void load_music( int x ){
	switch( x ){
	case 0: StopSoundMem( music[i] ); break;
	case 1: i=0;
			PlaySoundMem( music[i] , DX_PLAYTYPE_LOOP ); break;
	}
}

これで鳴ると思ったのですが全然鳴ってくれません。
load_music(1); をwhileの外(load_handle();の下)に書くと鳴ります。
どうすればBGMが鳴るようになるのでしょうか。
また、これだとなぜ鳴らないのかも教えてください。
よろしくお願いします。

※load.hは省きました。

田中太郎
記事: 24
登録日時: 13年前

Re: 音楽の再生について

#2

投稿記事 by 田中太郎 » 13年前

鳴らないと書きましたが、ウィンドウをクリックしていたり、別ウィンドウを選択すると鳴ってました。
これの原因もわかりません。
どなたか教えてください。

よろしくお願いします。

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: 音楽の再生について

#3

投稿記事 by とっち » 13年前

PlaySoundMem関数はLoadした音楽を最初から再生するような関数です。
ですので、WinMain関数のwhile文の中に入れてしまうと毎フレームごとに最初から再生されているようになります。
よってPlaySoundMem関数はwhile文の外に置くか別の方法をとる必要があります。

田中太郎
記事: 24
登録日時: 13年前

Re: 音楽の再生について

#4

投稿記事 by 田中太郎 » 13年前

>とっちさん
返信ありがとうございます。
ですが、whileの中にload_music(1);を書いてもなぜか再生されません。
さらに、ウィンドウを表示した状態で別ウィンドウを選択すると普通に再生されます。
これの理由がよくわかりません。

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: 音楽の再生について

#5

投稿記事 by とっち » 13年前

>whileの中にload_music(1);を書いてもなぜか再生されません。
ごめんなさい わからないです。

コード:

#include "DxLib.h"

int music;

void load_handle(){
	music=LoadSoundMem("test.ogg");
}

void load_music(int x){
	switch(x){
	case 0:StopSoundMem(music);break;
	case 1:PlaySoundMem(music,DX_PLAYTYPE_LOOP );break;
	}
}

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK );

	load_handle();
	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
		load_music(1);
	}

	DxLib_End();
	return 0;
}
こちらでこのようなコードで実験しましたが単一の音が永遠に繰り返される
ような結果になりましたので、もしかしたら処理系依存かもしれないです。
[他の人に任せます(^^;)]

>ウィンドウを表示した状態で別ウィンドウを選択すると普通に再生されます。
DXライブラリの場合実行されているウィンドウがアクティブの場合のみ処理が実行されます。
そのため別ウィンドウを開くとDXライブラリの実行ウィンドウがアクティブでなくなり、
PlaySoundMem関数がそれ以上呼ばれなくなります。
またStopSoundMem関数が呼ばれるわけでもないし実行も終わってないので音楽は止められず、
流れ続けるわけです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 音楽の再生について

#6

投稿記事 by softya(ソフト屋) » 13年前

どの関数もですが毎フレーム呼び出してはいけない関数だと思います。
呼び出されるたびに曲の頭から再生しようとするので、1/60秒ごとに曲の頭にもどるのでは?

別ウィンドウに移るとDXライブラリは動作をポーズ状態(ProcessMessage()関数から抜けてこない)にしますので PlaySoundMem()が毎フレーム呼ばれ無くなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

田中太郎
記事: 24
登録日時: 13年前

Re: 音楽の再生について

#7

投稿記事 by 田中太郎 » 13年前

whileの中にload_music(1);と書くと、music[0]に入っている"オープニング"が最初から何度も繰り返し再生されるので音が聞こえなかったのですね。
また、別ウィンドウなどを選択してるときは、このウィンドウがアクティブじゃなくなるので繰り返しの再生が止まり、今再生されているのが流れるということなんですね。

>とっちさん
>softya(ソフト屋)さん

ありがとうございました。

とっち
記事: 56
登録日時: 13年前
住所: 岡山

Re: 音楽の再生について

#8

投稿記事 by とっち » 13年前

ちなみにですが

コード:

//load.cpp
void load_music(){
	satic int state=0;
	switch(state){
	case 0:
		PlaySoundMem(music);
		state=1;
		break;
	case 1:
		if(止めたいタイミングなら)
			state=2;
		break;
	case 2:
		StopSoundMem(music);
		break;
	}
}
こういう方法もあります。
これならwhile文中でもPlaySoundMem関数は一度しか呼ばれず
正常な動作をします。

閉鎖

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