DXライブラリを使ったノベルゲームの音楽ファイルの再生について

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

DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#1

投稿記事 by ゴンマサ » 12年前

初めて質問させていただきます。
DXライブラリを使い始めて半年ほどになります。
初心者用の本を二冊ほど、またwebサイト等を参考にして勉強しています。

現在以下のページを参考にノベルゲームを作成しています。
http://www.usamimi.info/~guiprog/game/

このページで紹介されているプログラムを参考に、音楽ファイルを再生する機能をつけようとしたのですが、音楽が再生されません。

環境はWindows7、Visualstusio2010、DXライブラリを使用しています。
以下がソース本文になります。
ページ内のグラフィックに関する記述を参考にしています。

ヘッダーの記述

コード:

 
#ifndef music_H_
#define music_H_

#include "DxLib.h"


//音楽ファイルを管理
typedef struct MusicNode_tag{
	int id;
	int MusicHandle;

}MusicNode;

//再生する音楽ファイルを管理
typedef struct PlayMusicNode_tag{
	int musicId;
	int musicHandle;
	int musictype;//ループなどのタイプを決める記述
	int mode;//再生か、停止かを決める記述
}PlayMusicNode;

//音楽ファイルの同時登録数
#define MUSIC_MAX_NUM 2

//同時に再生できる最大の音楽ファイル数
#define PLAY_MUSIC_MAX_NUM 2


#define MUSIC_ON 0
#define MUSIC_OFF 1



//音楽ファイル管理
extern MusicNode m_musicManager[MUSIC_MAX_NUM];

//再生する音楽ファイルの管理
extern PlayMusicNode m_playMusic[PLAY_MUSIC_MAX_NUM];

//プロトタイプ宣言
void initMusicNode();
int addMusicNode(int id, const char*musicFilename);
int getMusicHandle(int id);

int addPlayMusic(int id,int musicId);

//この場合はpracticeソースへつなげる
void playMusicFile();
int stopPlayMusic(int musicId);

//idを削除する記述も後で書く



#endif

 
cppの記述

コード:

 

#include "music.h"




//音楽ファイル管理
MusicNode m_musicManager[MUSIC_MAX_NUM];

//再生する音楽ファイルの管理
PlayMusicNode m_playMusic[PLAY_MUSIC_MAX_NUM];


//初期化
void initMusicNode()
{
	//音楽ファイル管理初期化
	memset( &m_musicManager, 0, sizeof(MusicNode) * MUSIC_MAX_NUM );

	//再生する音楽ファイルの管理初期化
	memset( &m_playMusic, 0, sizeof(PlayMusicNode) * PLAY_MUSIC_MAX_NUM );
}

//音楽ファイルを読み込む
int addMusicNode(int id, const char* musicFilename)
{
	int i;
	//idが重複してないか確認
	for(i = 0;i<MUSIC_MAX_NUM;i++){
		if( id == m_musicManager[i].id){
		printf("idが重複しています(id %d)/n",id);
			return -1;
	}
}

//利用していないノードを見つける
for(i = 0;i < MUSIC_MAX_NUM; i++){
	if(id == m_musicManager[i].id){
		printf("idが重複しています(id %d)",id);
		return -1;
	}
}

//ミュージックノードの空きがない場合
if(i == MUSIC_MAX_NUM){
	printf("ミュージックノードの空きがありません(id %d)/n",id);
	return -1;
}


//ここまでがノードの確認作業
//以上に問題がない場合
//音楽ファイルの読み込みをする
m_musicManager[i].MusicHandle = LoadSoundMem(musicFilename);

//読み込みの失敗
if(m_musicManager[i].MusicHandle -1 ){
	printf("音楽ファイル読み込みに失敗しました(id%d)/n",id);
	m_musicManager[i].MusicHandle =0;
	return -1;
}

//idをセット
m_musicManager[i].id = id;
return 0;
}

//idからミュージックハンドルを取得する
int getMusicHandle(int id)
{
	int i = 0;
	for(i = 0;i < MUSIC_MAX_NUM;i++ ){
	 if( id == m_musicManager[i].id){
		 return m_musicManager[i].MusicHandle;
	 }
	}
	return -1;
}




//音楽ファイルを再生する際の設定
int addPlayMusic(int id, int musicId)
{
	int i;
	//①idからミュージックハンドルを取得
	int handle = getMusicHandle( id );

	//②MusicHandleの取得失敗
	if( handle == -1 ){
		printf("ID:%dの音楽ファイルは登録されていません/n",id);
		return -1;
	}

	//③musicIdが重複していないか確認
	for(i = 0; i < PLAY_MUSIC_MAX_NUM;i++){
		if(musicId == m_playMusic[i].musicId){
			printf("musicidが重複しています(id %d)/n",musicId);
			return -1;
		}
	}

	//④利用していないノードを見つける
	for(i =0;i<PLAY_MUSIC_MAX_NUM;i++){
		if(m_playMusic[i].musicId == 0 ){

	break;
}
}
	//⑤ノードの空きがない場合
	if(i == PLAY_MUSIC_MAX_NUM){
		printf("これ以上音声ファイルを再生できません(id %d)/n",musicId);
		return -1;
	}

	//以上①~⑤の手順をパスした場合、以下の設定を採用する
	m_playMusic[i].musicHandle = handle;
	m_playMusic[i].musicId = musicId;

	m_playMusic[i].mode = MUSIC_ON;

	return 0;

}


//指定したmusicIdの音楽ファイルを停止する
int stopPlayMusic(int musicId)
{
	int i;for(i =0;i<PLAY_MUSIC_MAX_NUM;i++){
		if( musicId == m_playMusic[i].musicId){
			m_playMusic[i].mode = MUSIC_OFF;
			return 0;
		}
	}
	return -1;
}


//音楽ファイルの操作
void playMusicFile()
{
	int i;
	for(i = 0;i<PLAY_MUSIC_MAX_NUM;i++){
		//musicIdが0でなければ
		if(m_playMusic[i].musicId!=0){
			

//音楽ファイルを再生する時(MUSIC_ON)の動作内容
			//メモリに読み込んだファイルのIDを検索して再生
	if(m_playMusic[i].mode == MUSIC_ON){

		//音楽ファイルを再生する記述

		PlaySoundMem( m_musicManager[i].MusicHandle,DX_PLAYTYPE_NORMAL,TRUE);
	}

//音楽ファイルを停止する時(MUSIC_OFF)の動作内容
	//メモリに読み込んだファイルのIDを検索して停止・削除
	if(m_playMusic[i].mode == MUSIC_OFF){

		//音楽ファイルを停止する記述
		StopSoundMem(m_musicManager[i].MusicHandle);
	    DeleteSoundMem( m_musicManager[i].MusicHandle ) ;
	}
		}
	}
}


ページ内のScript.cppの追加部分

コード:

 
//スクリプト文を解読する
//戻り値 1: 成功  0: 失敗

//音楽ファイルの再生について
///////////////////////////////////////////
//////////////////////////////////////////////////////
		//音楽ファイルをメモリに読み込む
	}else if( strncmp(message[0], "@@loadmusic", SCRIPT_MAX_STRING_LENGTH) == 0 ) {
		addMusicNode( atoi( message[1]), message[2]);
		//1-登録したID 2-そのファイルの場所と名前

		//メッセージの最初が@@playmusicのときは音楽ファイルを再生する命令が来たと判断
	}else if( strncmp(message[0], "@@playmusic", SCRIPT_MAX_STRING_LENGTH) == 0 ) {

		//音楽を再生
		//@@playmusicの後ろに続く変数を取得
		addPlayMusic(atoi(message[1]),atoi(message[2]) );
		//1-登録したID 2-登録した音楽ID 再生タイプはデフォルトでTRUEが入る

		//音楽ファイルを停止・削除
	}else if (strncmp(message[0], "@@stopmusic", SCRIPT_MAX_STRING_LENGTH) == 0 ) {
		stopPlayMusic( atoi(message[1])) ;
//////////////////////////////////////////////////////////
////////////////////////////////////////////////////


以上になります。

拙いコードで申し訳ありませんが、よろしくお願いいたします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#2

投稿記事 by h2so5 » 12年前

playMusicFileはどこで呼んでいるのですか。

ゴンマサ

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#3

投稿記事 by ゴンマサ » 12年前

早速の返信ありがとうございます。
記載漏れしていました。申し訳ありません。
Practice.cppのメインループの中に記述しています。

コード:

 


	//メインループ
	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_E ) == 0 ) {
		
		//画面クリア
		ClearDrawScreen();

		if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) {
			//マウス押しっぱなしの時にスクリプトがどんどん進まないようにする
			if( GetNowCount() - g_mouseClickedTime > 500 ) { 
				//キー入力待ちを解除
				unsetWaitKeyInput();
				//マウスクリックした時間を取得
				g_mouseClickedTime = GetNowCount();
			}
		}
		//選択ボックスがおされたかどうか
		//checkSelectBoxClicked(&g_script);

		//スクリプト言語の解析
		if( getWaitKeyInput() != WAIT_UNTIL_KEY_INPUT &&
			getWaitSelectBoxInput() != WAIT_UNTIL_KEY_INPUT ) {
			decodeScript( g_script.script[ g_script.currentLine ], &g_script );
			g_script.currentLine++;
		}
		//音楽ファイルの再生命令を実行
		playMusicFile();

		//画像描画・craphic.cppからの命令を実行
		drawVisibleGraphic();
		//選択肢ボックスの描画
	//	drawSelectBox();
		//メッセージ描画・Message.cppからの命令を実行
		drawMessage();

		Sleep(10);



		ScreenFlip();


	}

	DxLib_End();
	return 0;


アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#4

投稿記事 by h2so5 » 12年前

このコードだと毎フレームPlaySoundMemを呼ぶことになりませんか。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#5

投稿記事 by ISLe » 12年前

cppの58行目の条件式は書き写し間違いですか?

ゴンマサ

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#6

投稿記事 by ゴンマサ » 12年前

副管理人様
返信ありがとうございます。
使用している音楽ファイルは最初に一秒ほど無音の時間があるので
毎フレームPlaySoundMemを読み込み直しているため
音楽ファイルが再生し直され続けている状態なのでしょうか。

もしそうでしたらCheckSoundMemを使う必要があると思うのですが、
この関数はメインループの中に組み込むべきでしょうか。
それとも最初の質問のcppの151行目
「音楽ファイルを再生する時(MUSIC_ON)の動作内容」
の中に組み込むべきでしょうか。
あまりにも基本的なことかと思いますが、
宜しければお返事をお願いいたします。




ISLe様
質問ありがとうございます。
読み込みの失敗に関する記述
if(m_musicManager.MusicHandle -1 ){
のことでしたら
参考にしているプログラムのGraphic.cppの一部を改変して作ったものです。
以下の記述はそのプログラムの改変前のものです。

コード:

 
	//読み込み失敗時
	if( g_graphicManager[i].graphicHandle == -1 ) {
		printf("画像読み込みに失敗しました(id %d)\n", id);
		g_graphicManager[i].graphicHandle = 0;
		return -1;
	}
 
当方勉強不足のため、
今のところビルドが通るかどうかでしかはっきりとした間違いがわかりません。
もし何か気づきましたら御手数ですが教えていただけると幸いです。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#7

投稿記事 by ISLe » 12年前

if (hoge -1) { /* hogeから1を引いて、それが0でなければ実行される (hogeが1のとき以外は実行される) */ }
if (hoge == -1) { /* hogeが-1に等しいとき実行される */ }
です。
どちらもビルドは通ります。

ゴンマサ

Re: DXライブラリを使ったノベルゲームの音楽ファイルの再生について

#8

投稿記事 by ゴンマサ » 12年前

ISLe様

返信ありがとうございます。
返事がおそくなり大変失礼いたしました。
完成に向けて頑張ります。
ありがとうございました。

閉鎖

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