101 lines
3.3 KiB
JavaScript
101 lines
3.3 KiB
JavaScript
/*
|
|
|
|
Minigolf Cup sound player.
|
|
|
|
by Piper.Peppercorn October 2016
|
|
|
|
Plays a sound when a ball falls into the cup.
|
|
|
|
Then prepares the ball to self-delete after one minute.
|
|
|
|
Handles multiple balls if more than one player is active.
|
|
|
|
Distributed under the CreativeCommons license
|
|
|
|
*/
|
|
|
|
|
|
(function(){
|
|
const BALL_IN_CUP_SOUND_URL = "http://hifi-content.s3.amazonaws.com/caitlyn/production/minigolf%20course/mg_ball_in_cup_sound.wav";
|
|
const VICTORY_SOUND_URL = "https://dl.dropboxusercontent.com/u/96759331/victory2.wav";
|
|
const SOUND_VOLUME = 1.0; // Range of 0.0 silent to 1.0 full volume.
|
|
const ONE_SECOND = 1000;
|
|
const ONE_MINUTE = 60;
|
|
const ZERO_GRAVITY = {"x": 0.0, "y": 0.0, "z": 0.0}
|
|
const CUP_VERTICAL_POSITION_ADJUSTMENT = 0.015; // Ensure balls don't trigger until they have fallen into the cup.
|
|
const DYNAMIC = 1;
|
|
const STATIC = 0;
|
|
var _this = this;
|
|
var timer;
|
|
var interval = ONE_SECOND * 0.5;
|
|
var sensorBox;
|
|
|
|
|
|
var main = function() {
|
|
var validEntities = getValidEntitiesInSensorBox(sensorBox, "Sphere", DYNAMIC);
|
|
while(validEntities.length > 0) {
|
|
var entity = validEntities.pop();
|
|
triggerSoundAtEntity(
|
|
_this.BALL_SOUND,
|
|
SOUND_VOLUME,
|
|
entity.position
|
|
);
|
|
triggerSoundAtEntity(
|
|
_this.VICTORY_SOUND,
|
|
SOUND_VOLUME,
|
|
entity.position
|
|
);
|
|
// Deactivate the ball set to vanish after one minute.
|
|
var newProps = {
|
|
gravity: ZERO_GRAVITY,
|
|
dynamic: STATIC,
|
|
lifetime: ONE_MINUTE
|
|
};
|
|
Entities.editEntity(entity.id, newProps);
|
|
}
|
|
};
|
|
|
|
// Helper functions
|
|
|
|
var getValidEntitiesInSensorBox = function(sensor, entityType, dynamicState) {
|
|
var entitiesInBox = Entities.findEntitiesInBox(sensor.corner, sensor.size);
|
|
var validated = [];
|
|
for(var ent in entitiesInBox) {
|
|
var currentEntity = Entities.getEntityProperties(entitiesInBox[ent]);
|
|
if (currentEntity.type == entityType && currentEntity.dynamic == dynamicState) {
|
|
validated.push(currentEntity);
|
|
}
|
|
}
|
|
return validated;
|
|
};
|
|
|
|
|
|
var setupSensorBox = function(objectID) {
|
|
var boxProperties = Entities.getEntityProperties(objectID);
|
|
var boxDimensions = boxProperties.dimensions;
|
|
var pos = boxProperties.position;
|
|
var boxCorner = {
|
|
x:pos.x - (boxDimensions.x * 0.5),
|
|
y:pos.y - (boxDimensions.y * 0.5) - CUP_VERTICAL_POSITION_ADJUSTMENT,
|
|
z:pos.z - (boxDimensions.z * 0.5)
|
|
};
|
|
return {"corner": boxCorner, "size": boxDimensions};
|
|
};
|
|
|
|
|
|
var triggerSoundAtEntity = function(sound, soundVolume, entityPosition) {
|
|
var soundProps = {
|
|
volume: soundVolume,
|
|
position: entityPosition
|
|
};
|
|
Audio.playSound(sound, soundProps);
|
|
};
|
|
|
|
|
|
_this.preload = function(ID) {
|
|
_this.BALL_SOUND = SoundCache.getSound(BALL_IN_CUP_SOUND_URL);
|
|
_this.VICTORY_SOUND = SoundCache.getSound(VICTORY_SOUND_URL);
|
|
sensorBox = setupSensorBox(ID);
|
|
timer = Script.setInterval(main, interval);
|
|
};
|
|
})
|