例のごとくサウンドの内容にあらかじめ目を通しておいてください。
ただし、環境のせいか固有のバグなのか、スプライト以上に音声再生は安定していません。
SoundよりはMusicの方が安定しているかも……。
(scirpts/07 - Sounds.lua)
01:SCREEN_BOTTOM = 0 02:SCREEN_TOP = 1 03:BGBotText = Screen.LoadTextBG() 04:Screen.Initialize( SCREEN_BOTTOM, BGBotText ) 05: 06:BGBotText:PrintXY( 0, 0, "Sound Check" ) 07:BGBotText:PrintXY( 0, 2, "Press A for Blaster" ) 08:BGBotText:PrintXY( 0, 3, "Press B for Ion" ) 09:BGBotText:PrintXY( 0, 4, "Press X for Saber" ) 10:BGBotText:PrintXY( 0, 5, "Press Y to start/stop music" ) 11:BGBotText:PrintXY( 0, 7, "Press START to exit" ) 12: 13:SndBlaster = Sound.LoadRaw( "blaster.raw" ) 14:SndSaber = Sound.LoadRaw( "saberoff.raw" ) 15:SndIon = Sound.LoadRaw( "ion.raw" ) 16: 17:ModDK2 = Music.LoadMod( "dk2.mod" ) 18:bModPlaying = true 19:ModDK2:Play() 20: 21:while true do 22: if Pads.A() then 23: SndBlaster:Play() 24: while Pads.A() do 25: end 26: end 27: if Pads.B() then 28: SndIon:Play() 29: while Pads.B() do 30: end 31: end 32: if Pads.X() then 33: SndSaber:Play() 34: while Pads.X() do 35: end 36: end 37: if Pads.Y() then 38: bModPlaying = ( not bModPlaying ) 39: if bModPlaying then 40: ModDK2:Play() 41: else 42: ModDK2:Stop() 43: end 44: while Pads.Y() do 45: end 46: end 47: if Pads.Start() then 48: break 49: end 50: Screen.WaitForVBL() 51:end 52: 53:ModDK2:Free() 54:ModDK2 = nil 55:SndIon:Free() 56:SndIon = nil 57:SndSaber:Free() 58:SndSaber = nil 59:SndBlaster:Free() 60:SndBlaster = nil
プログラムの解説
01:SCREEN_BOTTOM = 0 02:SCREEN_TOP = 1
03:BGBotText = Screen.LoadTextBG() 04:Screen.Initialize( SCREEN_BOTTOM, BGBotText )
毎回の初期化処理
定義してるけどTOPは使いません
06:BGBotText:PrintXY( 0, 0, "Sound Check" ) 07:BGBotText:PrintXY( 0, 2, "Press A for Blaster" ) 08:BGBotText:PrintXY( 0, 3, "Press B for Ion" ) 09:BGBotText:PrintXY( 0, 4, "Press X for Saber" ) 10:BGBotText:PrintXY( 0, 5, "Press Y to start/stop music" ) 11:BGBotText:PrintXY( 0, 7, "Press START to exit" )
サウンドチェック
A、B、Xでそれぞれ別なSEの再生
YボタンでBGMの再生/停止切り替え
STARTボタンで終了
13:SndBlaster = Sound.LoadRaw( "blaster.raw" ) 14:SndSaber = Sound.LoadRaw( "saberoff.raw" ) 15:SndIon = Sound.LoadRaw( "ion.raw" )
サウンドファイルを読み込んでいます
17:ModDK2 = Music.LoadMod( "dk2.mod" )
BGMファイルの読み込み
18:bModPlaying = true
BGM再生フラグをtrueに
19:ModDK2:Play()
BGMを再生
21:while true do
51行目までのループ
22: if Pads.A() then 23: SndBlaster:Play() 24: while Pads.A() do 25: end 26: end
Aボタンを押したら対応したサウンドを再生
Aボタンを押している間はウェイトをかけています
27: if Pads.B() then 28: SndIon:Play() 29: while Pads.B() do 30: end 31: end
Bボタンを押したら対応したサウンドを再生
Bボタンを押している間はウェイトをかけています
32: if Pads.X() then 33: SndSaber:Play() 34: while Pads.X() do 35: end 36: end
Xボタンを押したら対応したサウンドを再生
Xボタンを押している間はウェイトをかけています
37: if Pads.Y() then
Yボタンを押したら
38: bModPlaying = ( not bModPlaying )
現在の再生モードを反転させ
39: if bModPlaying then 40: ModDK2:Play()
再生モードがtrueなら再生し
41: else 42: ModDK2:Stop()
再生モードがfalseなら停止します
43: end 44: while Pads.Y() do 45: end
こちらでもYボタンを押している間Waitをかけます。
こうすることによってすぐに次のループに入ってtrueとfalseが反転しないようにしています。
46: end
IF終了
47: if Pads.Start() then 48: break 49: end
STARTボタンで終了
50: Screen.WaitForVBL()
FPS固定
51:end
21行目のループの終端
53:ModDK2:Free() 54:ModDK2 = nil
BGMファイルのメモリ割り当て解放
変数の中身までクリアしています
55:SndIon:Free() 56:SndIon = nil 57:SndSaber:Free() 58:SndSaber = nil 59:SndBlaster:Free() 60:SndBlaster = nil
上に同じくサウンドのメモリ解放とオブジェクトのクリア