Updating variable on click

Hi Folks,

I’m currently updating a variable +1 on tap of an image.

This all works and updates.

My next part is I’m trying to change the sound every time a number is reached.

For example, if the variable reaches 21, it would stop the previous audio and play the next one and so on every time it reaches certain marks.

I managed to do something like that but it slowed down other stuff happening and my thoughts are that it was reloading the sound every time the person tapped and changed the number.

Could someone please assist me and tell me where i’m going wrong.

[lua]local soundScore = 0

local function updateSounds (event)
soundScore = soundScore + 1
hits.text = soundScore --To be deleted.
end
button:addEventListener(“tap”, updateSounds)


– SOUNDS –

if soundScore < 10 then
– Sound
s001 = audio.loadStream( “sound1.wav” )
audio.play( s001, { channel= 7, loops=-1} )
end
if soundScore > 20 then
audio.stop( 7 )
– Sound
s002 = audio.loadStream( “Sound2.wav” )
audio.play( s002, {channels=8, loops=-1} )
end
if soundScore > 30 then
audio.stop( 8 )
audio.dispose ( 8 )
– Sound
s003 = audio.loadStream( “Sound3.wav” )
sChannel = audio.play( s003, { channel=9, loops=1} )
end
if soundScore > 40 then
audio.stop(9)
audio.dispose(9)
– Sound
s004 = audio.loadStream( “Sound4.wav” )
sChannel = audio.play( s004, { channel=10, loops=1} )
end[/lua] [import]uid: 97707 topic_id: 21163 reply_id: 321163[/import]

How long are your sound clips? Are these just sound effects, or are they long playing music tracks?

Are they optimized for mobile (mono, 11khz vs. stereo 44K – huge difference in file size and memory usage, which translates to speed when loading)?

Why are you playing them on different channels?

[import]uid: 19626 topic_id: 21163 reply_id: 83806[/import]

Hi robmiracle,

Thanks for the reply,

I have checked the sounds and they are in that format.

They are 5 second sound clips which loop until told to stop.

I am playing them on different channels as that was what i thought was the best way so maybe my problem starts there.

Does the code i have written look ok to you?

Thanks [import]uid: 97707 topic_id: 21163 reply_id: 84184[/import]

Couple of things. I would consider using audio.load() instead of audio.loadStream(), four 5 second clips shouldn’t eat up a lot memory and you’re using them all the time. The loading of files is a slow down. You want to use audio.loadStream for like 2-3 minute long clips or longer so that those long load times are spread out over the app run time, but in your case its easier to pay the price up front to load the clips.

You need channels to handle when you are playing multiple sounds at once. Like in my game OmniBlaster (http://bit.ly/omniblaster), I have a background music track that plays continuously. I have explosions going on, weapons fire going on. Some of that weapons fire is a brief under 1 sec clip, others are upwards of 5 seconds. Then when the boss is on the screen there is a low rumbling sounds that loops while he’s on the screen. Each sound as it plays takes up a channel. Corona is really good about automatically finding a channel for you, so I let all my sfx fine a channel and only specifically deal with the background sounds on a set channel. Using channels also allows you to control the volume specifically on that channel. In your case, I don’t really see much of a need for you to worry about the channel.

As for your looping sounds, in two places you list the loops as -1 and in two others you have as just 1. So I’m a bit confused if those guys are supposed to loop too.

As for the code, I might think about doing this:

local soundScore = 0  
local sounds = {}  
local sounds[1] = audio.load( "sound1.wav" )  
local sounds[2] = audio.load( "Sound2.wav" )  
local sounds[3] = audio.load( "Sound3.wav" )  
local sounds[4] = audio.load( "Sound4.wav" )  
local playSound(index)  
 audio.stop()  
 audio.play(sounds[index), { loops=-1 })  
end  
   
local function updateSounds (event)  
 soundScore = soundScore + 1  
 hits.text = soundScore --To be deleted.  
 if soundScore \< 10 then  
 playSound(1)  
 elseif soundScore \> 20 then  
 playSound(2)  
 elseif soundScore \> 30 then  
 playSound(3)  
 elseif soundScore \> 40 then  
 playSound(4)  
 end  
 return true  
end  
button:addEventListener("tap", updateSounds)  
   

Now that code has a bug. What happens if the score is between 10 and 20 inclusive? I suspect you want to flip those greater than signs to less than signs for 20, 30 and then the last one should just be an “else” clause. It’s the way you had it so I kept that behavior.

Also its a good idea to be consistent with filename “case”. You have the first sound as a lower case “sound1.wav”, but the rest you have an Uppercase S in Sound2.wav, etc. It will save you headaches if you standardize on your file names (and I recommend all lower case…)

[import]uid: 19626 topic_id: 21163 reply_id: 84216[/import]