Random Access
October 3, 1999
by Pat McClellan
Dear Multimedia Handyman,
I am doing a game and need to put sound in. I was wondering if it is possible to have random sound? For example, every time one goes to the next level, one hears a random selection from 6 voiceovers. Thank you.
Jacqui
Dear Jacqui,
Director has a "random()" function which is quite handy in situations like this. Developing in Director, you'll find there are many cases where you need a random "something". I say "something" because it could be a graphic member, a sound member, an integer, a symbol -- almost anything. So what are the options to handle this?
First, let's get clear on how random() works. In the message window, try this:
put random(6) --2
Chances are, your result was not 2. It could have been 1, 2, 3, 4, 5 or 6. Try it again, several times. You'll find that it returns a random result each time. Note: statistical and computer purists will say that it's not truly random, since it is based on some algorithms somewhere. I've never really bothered to understand their position because for all practical purposes, it's "random enough".
You could simply line up your sound cast members in the first 6 spots of the internal cast. Then, when your player goes up a level (or whenever you want to play a random VO), call this playRandomVO movie script. Note that this is a movie script, not a score script. You don't drop it on a sprite or put it into the script channel. Rather, it will simply reside in your cast. (It will play the sound in channel 1.)
on playRandomVO whichChannel = 1 whichPick = random(6) whichSound = member whichPick of castLib 1 puppetSound whichChannel, whichSound updateStage end
That's one approach, but not necessarily the most versatile. For example, what if the cast members get moved. Or what if it's not practical -- for whatever reason -- to have the cast members located together. If we call the voiceOver cast members by name, then it really doesn't matter where they are. This approach will require that you maintain a strict naming convention. For example, I'll assume your VO cast members are named "vo1", "vo2", etc.
on playVObyName whichChannel = 1 whichPick = random(6) memberName = "vo" & whichPick puppetSound whichChannel, memberName updateStage end
Now, suppose that it's not practical to use the naming convention. Or perhaps you're not sure exactly how many cast members there will be in total, so you don't want to hard code the "random(6)" part. There's another option which is very applicable to many situations; you can simply use a list. In this approach, you'll create a list of the cast names and store the list in a global variable. Since you'll be using a list, you can use the count function to know the parameter for the random() call.
on startMovie global gVOlist gVOlist = ["youWin", "niceJob", "tooBad", "wayToGo", ¬ "keepItUp", "youDaMan"] -- you can add more sound member names -- without changing anything else end on playVOfromList global gVOlist whichChannel = 1 memberName = gVOlist[random(gVOlist.count)] puppetSound whichChannel, memberName updateStage end
The same concept would apply to other situations where you want to randomly select a cast member -- maybe a graphic cast member. For example, what if you wanted to have a sprite change to a randomly selected graphic on rollover?
A sample movie is available for download in Mac or PC format.
You could drop this behavior on the sprite.
property pCastList, pSprite, pNormalMem on beginSprite me pCastList = ["redCircle", "blueSquare", ¬ "greenTriangle", "yellowOval"] pSprite = sprite(me.spriteNum) pNormalMem = pSprite.member end beginSprite on mouseEnter me whichMem = pCastList[random(pCastList.count)] pSprite.member = whichMem end mouseEnter on mouseLeave me pSprite.member = pNormalMem end mouseLeave
Okay, so now you're catching on to this random() stuff. But you may have noted that random() always returns a positive integer. What if you need to generate a random number that isn't necessarily positive. For example, maybe you've got a game where at various points you need to change the players score, adding or subtracting up to 10 points at random. That means that you'll have a range of -10 up to 10. All we need to do is apply a quick bit of math to our formula.
We have a range of 21 possible values... from -10 to 10, including 0. So we'll need to start by doing a random(21) command, then adjusting the value down to our desired range. We do that simply by subtracting 11.
put random(21) - 11
Just to test the randomness and probability of the random() function, I wrote this quick handler to run a million random samples, then average them. If everything is working well, the average should be darn close to zero. Copy this into a movie script and call it from the message window. You can check the results for yourself.
on runRandom y = 0 repeat with i = 1 to 1000000 x = random(21) - 11 y = y + x end repeat put "average =" && y * 1.0000000000/1000000 end
There you have several examples of applying the random() function. There are many more ways to use it, which I'm sure you'll discover when you need it. Good luck with your program.
Copyright 1997-2024, Director Online. Article content copyright by respective authors.