202 lines
No EOL
6.7 KiB
JavaScript
202 lines
No EOL
6.7 KiB
JavaScript
//
|
|
// onPinataHit.js
|
|
// A script to handle pinata behavior
|
|
//
|
|
// Author: Elisa Lupin-Jimenez
|
|
// Copyright High Fidelity 2018
|
|
//
|
|
// Licensed under the Apache 2.0 License
|
|
// See accompanying license file or http://apache.org/
|
|
//
|
|
// All assets are under CC Attribution Non-Commerical
|
|
// http://creativecommons.org/licenses/
|
|
//
|
|
|
|
(function() {
|
|
|
|
var whackSound;
|
|
var partySound;
|
|
var paddleID;
|
|
var paddleOriginalPosition;
|
|
var pinataID;
|
|
var pinataOriginalPosition;
|
|
|
|
var WHACK_URL = Script.resolvePath("./sounds/whack.wav");
|
|
var PARTY_URL = Script.resolvePath("./sounds/PartyHorn4.wav");
|
|
var CONFETTI_HELPER_SCRIPT = Script.resolvePath("./confettiHelper.js");
|
|
var CHECK_DISTANCE_FROM_PADDLE = 3;
|
|
var CONFETTI_SIZE_RANDOMIZER = 0.5;
|
|
var AUDIO_VOLUME = 0.2;
|
|
var RESET_PINATA_DISTANCE = 1;
|
|
|
|
this.preload = function(entityID) {
|
|
paddleID = entityID;
|
|
paddleOriginalPosition = Entities.getEntityProperties(entityID, "position").position;
|
|
var pinataArray = Entities.findEntities(paddleOriginalPosition, CHECK_DISTANCE_FROM_PADDLE);
|
|
pinataArray.forEach(function(objectID) {
|
|
var objectProperties = Entities.getEntityProperties(objectID, ["position", "name"]);
|
|
if (objectProperties.name === "Pinata") {
|
|
pinataID = objectID;
|
|
pinataOriginalPosition = objectProperties.position;
|
|
}
|
|
});
|
|
// sound from http://soundbible.com/1952-Punch-Or-Whack.html
|
|
whackSound = SoundCache.getSound(WHACK_URL);
|
|
partySound = SoundCache.getSound(PARTY_URL);
|
|
};
|
|
|
|
var hits = 0;
|
|
var hitsToBreak = Math.random() * 10;
|
|
var TIMEOUT = 30000;
|
|
var CANDY_LIFETIME = 30;
|
|
|
|
var PARTICLE_COUNT = 8;
|
|
|
|
var CONFETTI = {
|
|
type: "ParticleEffect",
|
|
isEmitting: 1,
|
|
maxParticles: 8,
|
|
lifespan: 10,
|
|
lifetime: 3,
|
|
emitRate: 100,
|
|
emitSpeed: 3,
|
|
speedSpread: 1,
|
|
script: CONFETTI_HELPER_SCRIPT,
|
|
emitOrientation: Quat.fromVec3Degrees({x: 0, y: 90, z: 0}),
|
|
emitDimensions: {
|
|
x: 0.5,
|
|
y: 0.5,
|
|
z: 0.5
|
|
},
|
|
polarStart: Math.PI/180 * 75,
|
|
polarFinish: Math.PI/180 * (90+15),
|
|
azimuthStart: -0.3,
|
|
azimuthFinish: 0.3,
|
|
emitAcceleration: {
|
|
x: 0,
|
|
y: -0.5,
|
|
z: 0
|
|
},
|
|
accelerationSpread: {
|
|
x: 0,
|
|
y: 0,
|
|
z: 0
|
|
},
|
|
textures: Script.resolvePath("./assets/Confetti.png"),
|
|
alpha: 1,
|
|
alphaSpread: 0,
|
|
alphaStart: 1,
|
|
alphaFinish: 1,
|
|
emitterShouldTrail: 0
|
|
};
|
|
|
|
var CANDY = {
|
|
name: "Pinata Candy",
|
|
type: "Model",
|
|
modelURL: Script.resolvePath("./assets/candy/candy%20corn.obj"),
|
|
dimensions: {
|
|
x: 0.0784,
|
|
y: 0.1164,
|
|
z: 0.0784
|
|
},
|
|
dynamic: true,
|
|
collisionless: false,
|
|
shapeType: "Box",
|
|
gravity: {
|
|
"x": 0,
|
|
"y": -9.8,
|
|
"z": 0
|
|
},
|
|
lifetime: CANDY_LIFETIME,
|
|
script: Script.resolvePath("./crunch.js")
|
|
};
|
|
|
|
var randColor = function() {
|
|
return {
|
|
red: Math.random() * 255,
|
|
green: Math.random() * 255,
|
|
blue: Math.random() * 255
|
|
};
|
|
};
|
|
|
|
var shootConfetti = function(properties) {
|
|
for (var i = 0; i < PARTICLE_COUNT; i++) {
|
|
var part = CONFETTI;
|
|
|
|
part.colorStart = randColor();
|
|
part.colorFinish = part.colorStart;
|
|
part.color = part.colorStart;
|
|
part.dimensions = {
|
|
x: Math.random() * CONFETTI_SIZE_RANDOMIZER,
|
|
y: Math.random() * CONFETTI_SIZE_RANDOMIZER,
|
|
z: Math.random() * CONFETTI_SIZE_RANDOMIZER
|
|
};
|
|
part.position = properties.position;
|
|
part.rotation = properties.rotation;
|
|
Entities.addEntity(part, true);
|
|
}
|
|
};
|
|
|
|
var dropCandy = function(properties) {
|
|
for (var i = 0; i < PARTICLE_COUNT; i++) {
|
|
var candy = CANDY;
|
|
candy.position = properties.position;
|
|
Entities.addEntity(candy, true);
|
|
}
|
|
};
|
|
|
|
this.collisionWithEntity = function(paddleID, pinataID, collisionInfo) {
|
|
var pinataProperties = Entities.getEntityProperties(pinataID,
|
|
["name", "position", "rotation", "collisionless", "visible"]);
|
|
if (pinataProperties.name === "Pinata") {
|
|
shootConfetti(pinataProperties);
|
|
if (hits > hitsToBreak) {
|
|
Audio.playSound(partySound, {position: pinataProperties.position, volume: AUDIO_VOLUME, loop: false});
|
|
dropCandy(pinataProperties);
|
|
|
|
pinataProperties.name = "Invisible Pinata";
|
|
pinataProperties.collisionless = true;
|
|
pinataProperties.visible = false;
|
|
Entities.editEntity(pinataID, pinataProperties);
|
|
|
|
Script.setTimeout(function() {
|
|
hits = 0;
|
|
hitsToBreak = Math.random() * 10;
|
|
pinataProperties.name = "Pinata";
|
|
pinataProperties.collisionless = false;
|
|
pinataProperties.visible = true;
|
|
Entities.editEntity(pinataID, pinataProperties);
|
|
}, TIMEOUT);
|
|
} else {
|
|
Audio.playSound(whackSound, {position: pinataProperties.position, volume: AUDIO_VOLUME, loop: false});
|
|
hits++;
|
|
}
|
|
}
|
|
};
|
|
|
|
Script.setInterval(function() {
|
|
var pinataProperties = Entities.getEntityProperties(pinataID, "position");
|
|
var paddleProperties = Entities.getEntityProperties(paddleID, "position");
|
|
if (Vec3.distance(pinataOriginalPosition, pinataProperties.position) > RESET_PINATA_DISTANCE) {
|
|
pinataProperties.position = pinataOriginalPosition;
|
|
Entities.editEntity(pinataID, pinataProperties);
|
|
}
|
|
if (Vec3.distance(paddleOriginalPosition, paddleProperties.position) > RESET_PINATA_DISTANCE) {
|
|
paddleProperties.position = paddleOriginalPosition;
|
|
Entities.editEntity(paddleID, paddleProperties);
|
|
}
|
|
|
|
var pinataPointToOffsetFrom = Vec3.sum(pinataOriginalPosition, {
|
|
x: 0.0,
|
|
y: 2.0,
|
|
z: 0.0
|
|
});
|
|
|
|
Entities.addAction("offset", pinataID, {
|
|
pointToOffsetFrom: pinataPointToOffsetFrom,
|
|
linearDistance: 2.0,
|
|
linearTimeScale: 0.1
|
|
});
|
|
}, TIMEOUT);
|
|
|
|
}); |