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
#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 ) ;
}
}
}
}
//スクリプト文を解読する
//戻り値 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])) ;
//////////////////////////////////////////////////////////
////////////////////////////////////////////////////
以上になります。
拙いコードで申し訳ありませんが、よろしくお願いいたします。