07 - Sounds.lua

Last-modified: 2009-02-10 (火) 16:11:37

例のごとくサウンドの内容にあらかじめ目を通しておいてください。
ただし、環境のせいか固有のバグなのか、スプライト以上に音声再生は安定していません。
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

上に同じくサウンドのメモリ解放とオブジェクトのクリア

 

コメント