Start Page » DragonScript Scripting Language » Abstraction Layers: How you want to build your Game » Behavior Elements » ECBehaviorPlaySoundRandom
Extends ECBehaviorPlaySound to pick sound to play randomly from a list of sounds.
Useful for situations where random sounds from a list of sounds have to be played each time the behavior is triggered. If random sound list is empty behaves the same as ECBehaviorPlaySound.
ECBehaviorPlaySoundRandom uses the same element property prefix (playSound) as ECBehaviorPlaySound does. This allows using ECBehaviorPlaySoundRandom as replacement for ECBehaviorPlaySound if the need for random sounds arises. But this also means it is possible to use ECBehaviorPlaySoundRandom and ECBehaviorPlaySound with the same identifier. While technically possible this would cause property name clash and an exception is thrown due to duplicate properties added. Make sure to always use a unique identifier for both ECBehaviorPlaySoundRandom and ECBehaviorPlaySound as if they were the same class.
This behavior can be added multiple times to an element. This allows to play different sound events. Each instance has an identifier which can be used to retrieve a specific instance to play a one shot speaker. The prefix of the speaker class properties is playSound. . If the identifier is not empty the speaker element class properties have the prefix {id}.playSound. . This can be overwritten if required.
Hence to use more than one speaker use code like this in your subclass constructor:
class MyElementClass extends BehaviorElementClass
func new()
ECBehaviorPlaySoundRandom.new(this, null, null)
ECBehaviorPlaySoundRandom.new(this, null, null, "subPlaySound")
end
end
You can now define the parameters to use for both speakers using for example the properties volume for the first speaker and subPlaySound.volume for the second speaker.
It is recommended to always specify an identifier even if only one speaker is used. This avoids potentially name conflicts especially if other behaviors are added attaching other resources too.
Element class properties have the prefix playSound. or playSound({id}). if id is not empty.
Speaker type.
playSound.type or playSound({id}).typeAllowed Values:
| Value | Description |
|---|---|
point | Omnidirectional. |
directed | Directed. |
point<string name='playSound.type'>directed</string>
Path of sound resource to use.
playSound.sound or playSound({id}).sound*.ogg (all sound modules)<string name='playSound.sound'>click.ogg</string>
List of path of sound resource to randomly choose from.
playSound.sounds or playSound({id}).sounds*.ogg (all sound modules)<list name='playSound.sounds'> <string>click1.ogg</string> <string>click2.ogg</string> </list>
Speaker volume.
playSound.volume or playSound({id}).volume10<float name='playSound.volume'>0.8</float>
Speaker range in meters. Speaker is inaudible beyond range.
playSound.range or playSound({id}).range300<float name='playSound.range'>20</float>
Roll off. Value 1 is realistic (normal) roll-off. Values larger than 1 reduce volume faster near the sound source. Values smaller than 1 reduce volume faster near the sound range.
playSound.rollOff or playSound({id}).rollOff10<float name='playSound.rollOff'>1.5</float>
Distance offset for attenuation calculation. For use by distance sounds. Offsets the true distance to the sound source for attenuation calculation to make the sound appear coming from far away. Requires increasing the volume to compensate for the distance increased attenuation.
playSound.distanceOffset or playSound({id}).distanceOffset00<float name='playSound.distanceOffset'>500</float>
Play speed. Value of 1 is normal play speed. Values larger than 1 are faster (1.5 for example 150% play speed). Values less than 1 are slower (0.75 for example 75% play speed).
playSound.playSpeed or playSound({id}).playSpeed1<float name='playSound.playSpeed'>1.5</float>
Position to attach resource to collider.
playSound.position or playSound({id}).position<vector name='playSound.position' x='0' y='0' z='0.1'/>
Orientation to attach resource to collider in degrees.
playSound.orientation or playSound({id}).orientation<vector name='playSound.orientation' x='30' y='0' z='0'/>
Bone to attach resource to. If empty string attach to collider.
playSound.bone or playSound({id}).bone<string name='playSound.bone'>attach</string>
Play sound when trigger evaluates to true and pauses when trigger evaluates to false.
playSound.trigger or playSound({id}).trigger<string name='playSound.trigger'>@switchOnVent & @powerEnabled</string>
This behavior has no events.
This behavior adds these behavior tree actions if behavior tree is present. If behavior has non-empty identifier replace playSound with playSound(id).
Play sound.
This is an example of using this action:
<action name='playSound.play'/>
This behavior requires no other behaviors.
This behavior does not required element class to be persistable (setPersistable).
Since DragonScript Module Version 1.0
This example defines an element which can play sound.
class MyElement extends BehaviorElementClass
public var ECBehaviorComponent component
public var ECBehaviorCollider collider
public var ECBehaviorPlaySoundRandom playSound
func new()
component = ECBehaviorComponent.new(this, null)
collider = ECBehaviorCollider.new(this, component)
playSound = ECBehaviorPlaySoundRandom.new(this, component, collider)
end
end
Example of a door element playing sounds on open/close.
class DoorClass extends BehaviorElementClass
public ECBehaviorPlaySoundRandom playSoundOpen
public ECBehaviorPlaySoundRandom playSoundClose
func new()
// create and add play sound behavior for open door sound
playSoundOpen = ECBehaviorPlaySoundRandom.new(this, null, null, "open")
playSoundOpen.set("/content/door/open.ogg", 30.0, 0.8, Vector.new(0, 1, 0))
// create and add play sound behavior for close door sound
playSoundClose = ECBehaviorPlaySoundRandom.new(this, null, null, "close")
playSoundClose.set("/content/door/close.ogg", 30.0, 0.8, Vector.new(0, 1, 0))
end
end
class Door extends BehaviorElement
public ECBehaviorPlaySoundRandom.Instance playSoundOpen
public ECBehaviorPlaySoundRandom.Instance playSoundClose
func new(DoorClass eclass) super(eclass)
// find and store the behavior instances. it is not necessary to store them away
// but doing so is faster especially if playing sound many times and quickly
playSoundOpen = ECBehaviorPlaySoundRandom.getInstanceIn(this, null, null, "open")
playSoundClose = ECBehaviorPlaySoundRandom.getInstanceIn(this, null, null, "close")
end
func void openDoor()
// do what is needed to open the door
playSoundOpen.play()
end
func void closeDoor()
// do what is needed to close the door
playSoundClose.play()
end
end
Using element class supporting adding behaviors the behavior can be added like this:
<?xml version='1.0' encoding='UTF-8'?> <elementClass name='MyClass' class='GenericBehaviorElement'> <behavior type='ECBehaviorComponent'/> <behavior type='ECBehaviorCollider'/> <behavior type='ECBehaviorPlaySoundRandom'> <!-- optional: set layer mask (default '2' meaning BaseGameApp.WorldLayerBit.audio). list of bits to set. --> <string name='layerMask'>0 1 4</string> <!-- optional: use component with id instead of empty string --> <string name='component'>second</string> <!-- optional: use BaseGameApp trigger table. game can add more supported values. default is 'default' --> <string name='triggerTable'>default</string> <!-- set element properties. omit property prefix if used inside behavior tag --> <list name='.sound'> <string>click1.ogg</string> <string>click2.ogg</string> </list> </behavior> <!-- for adding multiple behaviors use unique identifiers --> <behavior type='ECBehaviorPlaySoundRandom' id='second'/> </elementClass>