Browse Source

Port SoundEffect sample to Lua.

Aster Jian 12 years ago
parent
commit
27d15eacc5
1 changed files with 167 additions and 0 deletions
  1. 167 0
      Bin/Data/LuaScripts/14_SoundEffects.lua

+ 167 - 0
Bin/Data/LuaScripts/14_SoundEffects.lua

@@ -0,0 +1,167 @@
+-- Sound effects example
+-- This sample demonstrates:
+--     - Playing sound effects and music
+--     - Controlling sound and music master volume
+
+require "LuaScripts/Utilities/Sample"
+
+local scene_ = nil
+
+local context = GetContext()
+
+local audio = GetAudio()
+local cache = GetCache()
+local input = GetInput()
+local ui = GetUI()
+
+local soundNames = {
+    "Fist",
+    "Explosion",
+    "Power-up"
+    }
+
+local soundResourceNames = {
+    "Sounds/PlayerFistHit.wav",
+    "Sounds/BigExplosion.wav",
+    "Sounds/Powerup.wav"
+    }
+    
+function Start()
+    -- Execute the common startup for samples
+    SampleStart()
+    
+    -- Enable OS cursor
+    input.mouseVisible = true
+
+    -- Create the user interface
+    CreateUI()
+end
+
+function Stop()
+end
+
+function CreateUI()
+    -- Create a scene which will not be actually rendered, but is used to hold SoundSource components while they play sounds
+    scene_ = Scene(context)
+
+    local uiStyle = cache:GetResource("XMLFile", "UI/DefaultStyle.xml")
+    -- Set style to the UI root so that elements will inherit it
+    ui.root.defaultStyle = uiStyle
+    
+    -- Create buttons for playing back sounds
+    for i, v in ipairs(soundNames) do
+        local button = CreateButton(i * 140 + 20, 20, 120, 40, v)
+        -- Store the sound effect resource name as a custom variable into the button
+        --button:SetVar("SoundResource", soundResourceNames[i])
+        button["SoundResource"] = soundResourceNames[i]
+        SubscribeToEvent(button, "Pressed", "HandlePlaySound")
+    end
+    
+    -- Create buttons for playing/stopping music
+    local button = CreateButton(20, 80, 120, 40, "Play Music")
+    SubscribeToEvent(button, "Released", "HandlePlayMusic")
+    
+    button = CreateButton(160, 80, 120, 40, "Stop Music")
+    SubscribeToEvent(button, "Released", "HandleStopMusic")
+
+    -- Create sliders for controlling sound and music master volume
+    local slider = CreateSlider(20, 140, 200, 20, "Sound Volume")
+    slider.value = audio:GetMasterGain(SOUND_EFFECT)
+    SubscribeToEvent(slider, "SliderChanged", "HandleSoundVolume")
+    
+    slider = CreateSlider(20, 200, 200, 20, "Music Volume")
+    slider.value = audio:GetMasterGain(SOUND_MUSIC)
+    SubscribeToEvent(slider, "SliderChanged", "HandleMusicVolume")
+end
+
+function CreateButton(x, y, xSize, ySize, text)
+    local font = cache:GetResource("Font", "Fonts/Anonymous Pro.ttf")
+    
+    -- Create the button and center the text onto it
+    local button = ui.root:CreateChild("Button")
+    button:SetStyleAuto()
+    button:SetPosition(x, y)
+    button:SetSize(xSize, ySize)
+    
+    local buttonText = button:CreateChild("Text")
+    buttonText:SetAlignment(HA_CENTER, VA_CENTER)
+    buttonText:SetFont(font, 12)
+    buttonText:SetText(text)
+    
+    return button
+end
+
+function CreateSlider(x, y, xSize, ySize, text)
+    local font = cache:GetResource("Font", "Fonts/Anonymous Pro.ttf")
+
+    -- Create text and slider below it
+    local sliderText = ui.root:CreateChild("Text")
+    sliderText:SetPosition(x, y)
+    sliderText:SetFont(font, 12)
+    sliderText:SetText(text)
+    
+    local slider = ui.root:CreateChild("Slider")
+    slider:SetStyleAuto()
+    slider:SetPosition(x, y + 20)
+    slider:SetSize(xSize, ySize)
+    -- Use 0-1 range for controlling sound/music master volume
+    slider.range = 1.0
+    
+    return slider
+end
+
+function HandlePlaySound(sender, eventType, eventData)
+    local button = tolua.cast(GetEventSender(), "Button")
+    --local soundResourceName = button:GetVar("SoundResource"):GetString()
+    local soundResourceName = button["SoundResource"]
+    
+    -- Get the sound resource
+    local sound = cache:GetResource("Sound", soundResourceName)
+
+    if sound ~= nil then
+        -- Create a scene node with a SoundSource component for playing the sound. The SoundSource component plays
+        -- non-positional audio, so its 3D position in the scene does not matter. For positional sounds the
+        -- SoundSource3D component would be used instead
+        local soundNode = scene_:CreateChild("Sound")
+        local soundSource = soundNode:CreateComponent("SoundSource")
+        soundSource:Play(sound)
+        -- In case we also play music, set the sound volume below maximum so that we don't clip the output
+        soundSource.gain = 0.7
+        -- Set the sound component to automatically remove its scene node from the scene when the sound is done playing
+        soundSource.autoRemove = true
+    end
+end
+
+function HandlePlayMusic(eventType, eventData)
+
+    -- Check if the music player node/component already exist
+    if scene_:GetChild("Music") ~= nil then
+        return
+    end
+
+    local music = cache:GetResource("Sound", "Music/Ninja Gods.ogg")
+    -- Set the song to loop
+    music.looped = true
+    
+    -- Create a scene node and a sound source for the music
+    local musicNode = scene_:CreateChild("Music")
+    local musicSource = musicNode:CreateComponent("SoundSource")
+    -- Set the sound type to music so that master volume control works correctly
+    musicSource.soundType = SOUND_MUSIC
+    musicSource:Play(music)
+end
+
+function HandleStopMusic(eventType, eventData)
+    -- Remove the music player node from the scene
+    scene_:RemoveChild(scene_:GetChild("Music"))
+end
+
+function HandleSoundVolume(eventType, eventData)
+    local newVolume = eventData:GetFloat("Value")
+    audio:SetMasterGain(SOUND_EFFECT, newVolume)
+end
+
+function HandleMusicVolume(eventType, eventData)
+    local newVolume = eventData:GetFloat("Value")
+    audio:SetMasterGain(SOUND_MUSIC, newVolume)
+end