2017-01-02 16 views
0

Мне нужна помощь относительно кнопки переключения виджета. Я создал кнопку 2 переключателей, которая предназначена для переключения звука и музыкального переключателя, но проблема заключается в том, что каждый раз, когда я выключаюсь и включаю музыкальный переключатель, музыка (mp3-звук) не реагирует, означает, что ее скорость быстро развивается каждый раз, когда я переключаю музыку на/выкл. Следующая проблема: каждый раз, когда я выключаю звуковой переключатель, он также отключает музыку (mp3-звук). Heres мой код:2 кнопка переключения звука и музыки Corona SDK?

--utils.lua

local sounds = {} 
sounds["select"] = audio.loadSound("sounds/select.mp3") 
sounds["score"] = audio.loadSound("sounds/score.mp3") 
sounds["incorrect"] = audio.loadSound("sounds/gameover.mp3") 
sounds["clap"] = audio.loadSound("sounds/clapping.mp3") 
sounds["music"] = audio.loadSound("sounds/gameMusic.mp3") 

M.playSound = function(name) 
    if sounds[name] ~= nil then 
     audio.play(sounds[name]) 
    end 
end 

--Settings.lua

soundSwitchPressed = function(event) 
local switch = event.target 
utils.playSound("select") 


if switch.id == "sound" then 
    if switch.isOn == true then 
     audio.setVolume(0) 
    else 
     audio.setVolume(1) 
    end 
end 
end 

musicSwitchPressed = function(event) 
    local switch = event.target 
    utils.playSound("music") 

    if switch.id == "music" then 
     if switch.isOn == true then 
      audio.setVolume(0) 
     else 
      audio.setVolume(1) 
     end 

    end 
end 



local sound_switch = widget.newSwitch 
    { 
     left = _W-70, 
     top = navBar.y + navBar.height/2 + 44, 
     style = "onOff", 
     id = "sound", 
     x = 800, 
     y = 960, 
     onPress = soundSwitchPressed 
    } 
    sound_switch.xScale, sound_switch.yScale = 3, 3 
    uiGroup:insert(sound_switch) 

    local music_switch = widget.newSwitch 
    { 
     left = _W-70, 
     top = navBar.y + navBar.height/2 + 44, 
     style = "onOff", 
     id = "music", 
     x = 800, 
     y = 1200, 
     onPress = musicSwitchPressed 
    } 

    if audio.getVolume() == 0 then 
     sound_switch:setState({isOn=false, isAnimated=false}) 
     music_switch:setState({isOn=false, isAnimated=false}) 
    else 
     sound_switch:setState({isOn=true, isAnimated=false}) 
     music_switch:setState({isOn=true, isAnimated=false}) 
    end 
end 

enter image description here

ответ

1

Я не уверен, что ваш путь хорош. Я beginer, но я хочу помочь вам :)

От Corona документации о audio.setVolume()

Sets the volume either for a specific channel, or sets the master volume.

Так audio.setVolume() воздействует на все звуки и музыку.

Возможно, попробуйте использовать переменную, чтобы определить, воспроизводятся или нет звуки и музыка.

utils.lua

audio.reserveChannels(6) 
... 
sounds["select"] = audio.loadSound("sounds/select.mp3") 
sounds["score"] = audio.loadSound("sounds/score.mp3") 
sounds["incorrect"] = audio.loadSound("sounds/gameover.mp3") 
sounds["clap"] = audio.loadSound("sounds/clapping.mp3") 
sounds["music"] = audio.loadSound("sounds/gameMusic.mp3") 

local channels = {} 
sounds["select"] = 1 
sounds["score"] = 2 
sounds["incorrect"] = 3 
sounds["clap"] = 4 
sounds["music"] = 5 

music = audio.loadStream("backgroundMusic.mp3") 

M.soundOn = true 
M.musicOn = true 

M.playMusic = function() 
    if music ~= nil then 
     audio.play(music, { channel = 6 }) 
    end 
end 

M.playSound = function(name) 
     if sounds[name] ~= nil then 
      audio.play(sounds[name], { channel = channels[name]}) 
     end 
    end 

Settings.lua

... 
soundSwitchPressed = function(event) 
local switch = event.target 

if utils.soundOn then 
    utils.playSound("select") 
end 

if switch.id == "sound" then 
    if switch.isOn == true then 
     utils.soundOn = true 
    else 
     utils.soundOn = false 
     audio.stop(1) 
     audio.stop(2) 
     audio.stop(3) 
     audio.stop(4) 
     audio.stop(5) 
    end 
end 
end 
... 

musicSwitchPressed = function(event) 
    local switch = event.target 

    if utils.musicOn then 
     utils.playSound("music") 
    end 

    if switch.id == "music" then 
     if switch.isOn == true then 
      utils.musicOn = true 
      utils.playMusic() 
     else 
      utils.musicOn = false 
      audio.stop(6) 
     end 

    end 
end 

Всякий раз, когда вы играете в звуковой код пут

if utils.soundOn then 
    utils.playSound("your_sound_effect_name") 
end 

или

if utils.musicOn then 
    utils.playMusic() 
end 

Подробнее о audio.

+0

Господин Idurniat есть еще один способ объявить канал? ех. звучит ["select"]. channel = 1 <- im, имеющий ошибку с таким объявлением, сказал: ERROR: попытка индексировать поле «select» (значение пользовательских данных). btw Я пробовал это звуки ["clap" ] = audio.loadSound ("sounds/clapping.mp3", {channel = 1}) по-прежнему имеет ту же ошибку ... плохо читайте больше об аудио ... –

+0

Я улучшил свой ответ. Теперь он должен работать. Это неправильный синтаксис 'sounds [" clap "] = audio.loadSound (" sounds/clapping.mp3 ", {channel = 1})' Вам нужно использовать параметр 'channel', когда вы играете, останавливаетесь и т. Д., Например,' audio .stop (1) 'или' audio.setVolume (0, {channel = 1}) '. – ldurniat

+0

Вы действительно отличная помощь idurniat, но как я могу сохранить анимированную кнопку моего переключателя? После щелчка мышью мой переключатель не спасет себя. Инструкция if-else audio.getVolume не сохраняет мою кнопку анимированного переключателя после редактирования кодов. Но я попытался, если audio.stop() == nil. все еще не работает. –