こちらを参考にして作成しております。
http://www.usamimi.info/~guiprog/game/
あれからスクリプト言語を改良し、前よりは簡潔な記述にできたのですが、どうもうまくいきません。
音楽ファイルの再生をループに入る前に行う方法が思いつかなかったため
whileの中にgotoやcontinueを使ってみたのですが音楽が再生されませんでした。
ヒントなどいただければと思います。
よろしくお願いいたします。
音楽ファイルを読み込む際のスクリプト言語(抜粋)
//音楽ファイルをメモリに読み込む
}else if( strncmp(message[0], "@@loadmusic", SCRIPT_MAX_STRING_LENGTH) == 0 ) {
LoadMusicFile(message[1]);//1は音楽ファイル名
//音楽ファイルを停止・削除
}else if (strncmp(message[0], "@@stopmusic", SCRIPT_MAX_STRING_LENGTH) == 0 ) {
StopPlayMusic() ;
音楽ファイルの再生に関するヘッダー
#include "DxLib.h"
static int M_Memory;//音楽ファイルのメモリ
void LoadMusicFile(const char*musicFilename);//音楽ファイルを読み込むための記述
void PlayMusic();//音楽ファイルを再生するための記述
void StopPlayMusic();//StopMusicではDXライブラリのリファレンスに存在しているため重複を避ける
音楽ファイルの再生に関するソース
#include "music.h"
//音楽ファイルを読み込む記述
void LoadMusicFile(const char* musicFilename)
{
M_Memory = LoadSoundMem(musicFilename);
}
//音楽ファイルを再生する記述
void PlayMusic()
{
PlaySoundMem(M_Memory , DX_PLAYTYPE_LOOP );
}
//再生されている音楽ファイルを停止・メモリから削除する
void StopPlayMusic()
{
StopSoundMem( M_Memory );
DeleteSoundMem( M_Memory );
}
gotoを使った場合のループの記述
int Game_Draw(){
//DxLib初期化
if( DxLib_Init() == -1 ) {
return -1;
}
initGame();
ClearDrawScreen() ;
MUSIC:
PlayMusic();
//ここからメインループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_E ) == 0 ) {
//画面クリア
ClearDrawScreen();
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) {
//マウス押しっぱなしの時にスクリプトがどんどん進まないようにする
if( GetNowCount() - g_mouseClickedTime > 500 ) {
//キー入力待ちを解除
unsetWaitKeyInput();
//マウスクリックした時間を取得
g_mouseClickedTime = GetNowCount();
}
}
//スクリプト言語の解析
if( getWaitKeyInput() != WAIT_UNTIL_KEY_INPUT &&
getWaitSelectBoxInput() != WAIT_UNTIL_KEY_INPUT ) {
decodeScript( g_script.script[ g_script.currentLine ], &g_script );
g_script.currentLine++;
}
//スクリプトを解析して、それぞれの対応した場所に命令を出し、それをループの中に返している
//画像描画・craphic.cppからの命令を実行
drawVisibleGraphic();
//メッセージ描画・Message.cppからの命令を実行
drawMessage();
//音楽ファイルの再生を停止、メモリから削除
StopPlayMusic();
Sleep(10);
ScreenFlip();
//音楽ファイルが再生されている場合は
//以下の記述を省略しループの先頭に戻る
if(CheckSoundMem( M_Memory ) == 0)
goto MUSIC;
}//ループの終わり
DxLib_End();//継続条件が満たされなくなったとき
return 0;
}
continueを使った場合のループの記述(ソースやヘッダーの記述はgotoの時と同じです)
int Game_Draw(){
//DxLib初期化
if( DxLib_Init() == -1 ) {
return -1;
}
initGame();
//ここからメインループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_E ) == 0 ) {
//画面クリア
ClearDrawScreen();
if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) {
//マウス押しっぱなしの時にスクリプトがどんどん進まないようにする
if( GetNowCount() - g_mouseClickedTime > 500 ) {
//キー入力待ちを解除
unsetWaitKeyInput();
//マウスクリックした時間を取得
g_mouseClickedTime = GetNowCount();
}
}
//スクリプト言語の解析
if( getWaitKeyInput() != WAIT_UNTIL_KEY_INPUT &&
getWaitSelectBoxInput() != WAIT_UNTIL_KEY_INPUT ) {
decodeScript( g_script.script[ g_script.currentLine ], &g_script );
g_script.currentLine++;
}
//スクリプトを解析して、それぞれの対応した場所に命令を出し、それをループの中に返している
//画像描画・craphic.cppからの命令を実行
drawVisibleGraphic();
//メッセージ描画・Message.cppからの命令を実行
drawMessage();
//音楽ファイルの再生を停止、メモリから削除
StopPlayMusic();
Sleep(10);
ScreenFlip();
//音楽ファイルが再生されている場合は
//以下の記述を省略しループの先頭に戻る
if(CheckSoundMem( M_Memory ) == 1)
continue;
PlayMusic();
}//ループの終わり
DxLib_End();//継続条件が満たされなくなったとき
return 0;
}
以上になります。
よろしくお願いいたします。