mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 19:59:28 +02:00
commit
2363ca044e
3 changed files with 494 additions and 0 deletions
265
examples/example/games/color_busters/colorBusterWand.js
Normal file
265
examples/example/games/color_busters/colorBusterWand.js
Normal file
|
@ -0,0 +1,265 @@
|
||||||
|
//
|
||||||
|
// colorBusterWand.js
|
||||||
|
//
|
||||||
|
// Created by James B. Pollack @imgntn on 11/2/2015
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// This is the entity script that attaches to a wand for the Color Busters game
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
Script.include("../../../libraries/utils.js");
|
||||||
|
|
||||||
|
var COMBINED_COLOR_DURATION = 5;
|
||||||
|
|
||||||
|
var INDICATOR_OFFSET_UP = 0.40;
|
||||||
|
|
||||||
|
var REMOVE_CUBE_SOUND_URL = 'http://hifi-public.s3.amazonaws.com/sounds/color_busters/boop.wav';
|
||||||
|
var COMBINE_COLORS_SOUND_URL = 'http://hifi-public.s3.amazonaws.com/sounds/color_busters/powerup.wav';
|
||||||
|
|
||||||
|
var COLOR_INDICATOR_DIMENSIONS = {
|
||||||
|
x: 0.10,
|
||||||
|
y: 0.10,
|
||||||
|
z: 0.10
|
||||||
|
};
|
||||||
|
|
||||||
|
var _this;
|
||||||
|
|
||||||
|
function ColorBusterWand() {
|
||||||
|
_this = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
ColorBusterWand.prototype = {
|
||||||
|
combinedColorsTimer: null,
|
||||||
|
soundIsPlaying: false,
|
||||||
|
preload: function(entityID) {
|
||||||
|
print("preload");
|
||||||
|
this.entityID = entityID;
|
||||||
|
this.REMOVE_CUBE_SOUND = SoundCache.getSound(REMOVE_CUBE_SOUND_URL);
|
||||||
|
this.COMBINE_COLORS_SOUND = SoundCache.getSound(COMBINE_COLORS_SOUND_URL);
|
||||||
|
},
|
||||||
|
|
||||||
|
collisionWithEntity: function(me, otherEntity, collision) {
|
||||||
|
var otherProperties = Entities.getEntityProperties(otherEntity, ["name", "userData"]);
|
||||||
|
var myProperties = Entities.getEntityProperties(me, ["userData"]);
|
||||||
|
var myUserData = JSON.parse(myProperties.userData);
|
||||||
|
var otherUserData = JSON.parse(otherProperties.userData);
|
||||||
|
|
||||||
|
if (otherProperties.name === 'Hifi-ColorBusterWand') {
|
||||||
|
print('HIT ANOTHER COLOR WAND!!');
|
||||||
|
if (otherUserData.hifiColorBusterWandKey.colorLocked !== true && myUserData.hifiColorBusterWandKey.colorLocked !== true) {
|
||||||
|
if (otherUserData.hifiColorBusterWandKey.originalColorName === myUserData.hifiColorBusterWandKey.originalColorName) {
|
||||||
|
print('BUT ITS THE SAME COLOR!')
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
print('COMBINE COLORS!' + this.entityID);
|
||||||
|
this.combineColorsWithOtherWand(otherUserData.hifiColorBusterWandKey.originalColorName, myUserData.hifiColorBusterWandKey.originalColorName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherProperties.name === 'Hifi-ColorBusterCube') {
|
||||||
|
if (otherUserData.hifiColorBusterCubeKey.originalColorName === myUserData.hifiColorBusterWandKey.currentColor) {
|
||||||
|
print('HIT THE SAME COLOR CUBE');
|
||||||
|
this.removeCubeOfSameColor(otherEntity);
|
||||||
|
} else {
|
||||||
|
print('HIT A CUBE OF A DIFFERENT COLOR');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
combineColorsWithOtherWand: function(otherColor, myColor) {
|
||||||
|
print('combining my :' + myColor + " with their: " + otherColor);
|
||||||
|
|
||||||
|
if ((myColor === 'violet') || (myColor === 'orange') || (myColor === 'green')) {
|
||||||
|
print('MY WAND ALREADY COMBINED');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var newColor;
|
||||||
|
if ((otherColor === 'red' && myColor == 'yellow') || (myColor === 'red' && otherColor === 'yellow')) {
|
||||||
|
//orange
|
||||||
|
newColor = 'orange';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((otherColor === 'red' && myColor == 'blue') || (myColor === 'red' && otherColor === 'blue')) {
|
||||||
|
//violet
|
||||||
|
newColor = 'violet';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((otherColor === 'blue' && myColor == 'yellow') || (myColor === 'blue' && otherColor === 'yellow')) {
|
||||||
|
//green.
|
||||||
|
newColor = 'green';
|
||||||
|
}
|
||||||
|
|
||||||
|
_this.combinedColorsTimer = Script.setTimeout(function() {
|
||||||
|
_this.resetToOriginalColor(myColor);
|
||||||
|
_this.combinedColorsTimer = null;
|
||||||
|
}, COMBINED_COLOR_DURATION * 1000);
|
||||||
|
|
||||||
|
setEntityCustomData('hifiColorBusterWandKey', this.entityID, {
|
||||||
|
owner: MyAvatar.sessionUUID,
|
||||||
|
currentColor: newColor,
|
||||||
|
originalColorName: myColor,
|
||||||
|
colorLocked: false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
this.playSoundAtCurrentPosition(false);
|
||||||
|
},
|
||||||
|
|
||||||
|
setCurrentColor: function(newColor) {
|
||||||
|
var color;
|
||||||
|
|
||||||
|
if (newColor === 'orange') {
|
||||||
|
color = {
|
||||||
|
red: 255,
|
||||||
|
green: 165,
|
||||||
|
blue: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newColor === 'violet') {
|
||||||
|
color = {
|
||||||
|
red: 128,
|
||||||
|
green: 0,
|
||||||
|
blue: 128
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newColor === 'green') {
|
||||||
|
color = {
|
||||||
|
red: 0,
|
||||||
|
green: 255,
|
||||||
|
blue: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newColor === 'red') {
|
||||||
|
color = {
|
||||||
|
red: 255,
|
||||||
|
green: 0,
|
||||||
|
blue: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newColor === 'yellow') {
|
||||||
|
color = {
|
||||||
|
red: 255,
|
||||||
|
green: 255,
|
||||||
|
blue: 0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newColor === 'blue') {
|
||||||
|
color = {
|
||||||
|
red: 0,
|
||||||
|
green: 0,
|
||||||
|
blue: 255
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Entities.editEntity(this.colorIndicator, {
|
||||||
|
color: color
|
||||||
|
});
|
||||||
|
|
||||||
|
// print('SET THIS COLOR INDICATOR TO:' + newColor);
|
||||||
|
},
|
||||||
|
|
||||||
|
resetToOriginalColor: function(myColor) {
|
||||||
|
setEntityCustomData('hifiColorBusterWandKey', this.entityID, {
|
||||||
|
owner: MyAvatar.sessionUUID,
|
||||||
|
currentColor: myColor,
|
||||||
|
originalColorName: myColor,
|
||||||
|
colorLocked: false
|
||||||
|
});
|
||||||
|
|
||||||
|
this.setCurrentColor(myColor);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeCubeOfSameColor: function(cube) {
|
||||||
|
this.playSoundAtCurrentPosition(true);
|
||||||
|
Entities.callEntityMethod(cube, 'cubeEnding');
|
||||||
|
Entities.deleteEntity(cube);
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
startNearGrab: function() {
|
||||||
|
this.currentProperties = Entities.getEntityProperties(this.entityID);
|
||||||
|
this.createColorIndicator();
|
||||||
|
},
|
||||||
|
|
||||||
|
continueNearGrab: function() {
|
||||||
|
this.currentProperties = Entities.getEntityProperties(this.entityID);
|
||||||
|
|
||||||
|
var color = JSON.parse(this.currentProperties.userData).hifiColorBusterWandKey.currentColor;
|
||||||
|
|
||||||
|
this.setCurrentColor(color);
|
||||||
|
this.updateColorIndicatorLocation();
|
||||||
|
},
|
||||||
|
|
||||||
|
releaseGrab: function() {
|
||||||
|
Entities.deleteEntity(this.colorIndicator);
|
||||||
|
if (this.combinedColorsTimer !== null) {
|
||||||
|
Script.clearTimeout(this.combinedColorsTimer);
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
createColorIndicator: function(color) {
|
||||||
|
|
||||||
|
|
||||||
|
var properties = {
|
||||||
|
name: 'Hifi-ColorBusterIndicator',
|
||||||
|
type: 'Box',
|
||||||
|
dimensions: COLOR_INDICATOR_DIMENSIONS,
|
||||||
|
position: this.currentProperties.position,
|
||||||
|
collisionsWillMove: false,
|
||||||
|
ignoreForCollisions: true
|
||||||
|
}
|
||||||
|
|
||||||
|
this.colorIndicator = Entities.addEntity(properties);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateColorIndicatorLocation: function() {
|
||||||
|
|
||||||
|
var position;
|
||||||
|
|
||||||
|
var upVector = Quat.getUp(this.currentProperties.rotation);
|
||||||
|
var indicatorVector = Vec3.multiply(upVector, INDICATOR_OFFSET_UP);
|
||||||
|
position = Vec3.sum(this.currentProperties.position, indicatorVector);
|
||||||
|
|
||||||
|
var properties = {
|
||||||
|
position: position,
|
||||||
|
rotation: this.currentProperties.rotation
|
||||||
|
}
|
||||||
|
|
||||||
|
Entities.editEntity(this.colorIndicator, properties);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
playSoundAtCurrentPosition: function(isRemoveCubeSound) {
|
||||||
|
|
||||||
|
var position = Entities.getEntityProperties(this.entityID, "position").position;
|
||||||
|
var audioProperties = {
|
||||||
|
volume: 0.25,
|
||||||
|
position: position
|
||||||
|
};
|
||||||
|
|
||||||
|
if (isRemoveCubeSound === true) {
|
||||||
|
Audio.playSound(this.REMOVE_CUBE_SOUND, audioProperties);
|
||||||
|
} else {
|
||||||
|
Audio.playSound(this.COMBINE_COLORS_SOUND, audioProperties);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
return new ColorBusterWand();
|
||||||
|
});
|
130
examples/example/games/color_busters/createColorBusterCubes.js
Normal file
130
examples/example/games/color_busters/createColorBusterCubes.js
Normal file
|
@ -0,0 +1,130 @@
|
||||||
|
//
|
||||||
|
// createColorBusterCubes.js
|
||||||
|
//
|
||||||
|
// Created by James B. Pollack @imgntn on 11/2/2015
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// This script creates cubes that can be removed with a Color Buster wand.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
var DELETE_AT_ENDING = false;
|
||||||
|
|
||||||
|
var CUBE_DIMENSIONS = {
|
||||||
|
x: 1,
|
||||||
|
y: 1,
|
||||||
|
z: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
var NUMBER_OF_CUBES_PER_SIDE = 8;
|
||||||
|
|
||||||
|
var STARTING_CORNER_POSITION = {
|
||||||
|
x: 100,
|
||||||
|
y: 100,
|
||||||
|
z: 100
|
||||||
|
};
|
||||||
|
var STARTING_COLORS = [
|
||||||
|
['red', {
|
||||||
|
red: 255,
|
||||||
|
green: 0,
|
||||||
|
blue: 0
|
||||||
|
}],
|
||||||
|
['yellow', {
|
||||||
|
red: 255,
|
||||||
|
green: 255,
|
||||||
|
blue: 0
|
||||||
|
}],
|
||||||
|
['blue', {
|
||||||
|
red: 0,
|
||||||
|
green: 0,
|
||||||
|
blue: 255
|
||||||
|
}],
|
||||||
|
['orange', {
|
||||||
|
red: 255,
|
||||||
|
green: 165,
|
||||||
|
blue: 0
|
||||||
|
}],
|
||||||
|
['violet', {
|
||||||
|
red: 128,
|
||||||
|
green: 0,
|
||||||
|
blue: 128
|
||||||
|
}],
|
||||||
|
['green', {
|
||||||
|
red: 0,
|
||||||
|
green: 255,
|
||||||
|
blue: 0
|
||||||
|
}]
|
||||||
|
];
|
||||||
|
|
||||||
|
function chooseStartingColor() {
|
||||||
|
var startingColor = STARTING_COLORS[Math.floor(Math.random() * STARTING_COLORS.length)];
|
||||||
|
return startingColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
var cubes = [];
|
||||||
|
|
||||||
|
function createColorBusterCube(row, column, vertical) {
|
||||||
|
|
||||||
|
print('make cube at ' + row + ':' + column + ":" + vertical);
|
||||||
|
|
||||||
|
var position = {
|
||||||
|
x: STARTING_CORNER_POSITION.x + row,
|
||||||
|
y: STARTING_CORNER_POSITION.y + vertical,
|
||||||
|
z: STARTING_CORNER_POSITION.z + column
|
||||||
|
};
|
||||||
|
|
||||||
|
var startingColor = chooseStartingColor();
|
||||||
|
var colorBusterCubeProperties = {
|
||||||
|
name: 'Hifi-ColorBusterCube',
|
||||||
|
type: 'Box',
|
||||||
|
dimensions: CUBE_DIMENSIONS,
|
||||||
|
collisionsWillMove: false,
|
||||||
|
ignoreForCollisions: false,
|
||||||
|
color: startingColor[1],
|
||||||
|
position: position,
|
||||||
|
userData: JSON.stringify({
|
||||||
|
hifiColorBusterCubeKey: {
|
||||||
|
originalColorName: startingColor[0]
|
||||||
|
},
|
||||||
|
grabbableKey: {
|
||||||
|
grabbable: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
var cube = Entities.addEntity(colorBusterCubeProperties);
|
||||||
|
cubes.push(cube);
|
||||||
|
return cube
|
||||||
|
}
|
||||||
|
|
||||||
|
function createBoard() {
|
||||||
|
var vertical;
|
||||||
|
var row;
|
||||||
|
var column;
|
||||||
|
for (vertical = 0; vertical < NUMBER_OF_CUBES_PER_SIDE; vertical++) {
|
||||||
|
print('vertical:' + vertical)
|
||||||
|
//create a single layer
|
||||||
|
for (row = 0; row < NUMBER_OF_CUBES_PER_SIDE; row++) {
|
||||||
|
print('row:' + row)
|
||||||
|
for (column = 0; column < NUMBER_OF_CUBES_PER_SIDE; column++) {
|
||||||
|
print('column:' + column)
|
||||||
|
createColorBusterCube(row, column, vertical)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteCubes() {
|
||||||
|
while (cubes.length > 0) {
|
||||||
|
Entities.deleteEntity(cubes.pop());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DELETE_AT_ENDING === true) {
|
||||||
|
Script.scriptEnding.connect(deleteCubes);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
createBoard();
|
|
@ -0,0 +1,99 @@
|
||||||
|
//
|
||||||
|
// createColorBusterWand.js
|
||||||
|
//
|
||||||
|
// Created by James B. Pollack @imgntn on 11/2/2015
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// This script creates a wand that can be used to remove color buster blocks. Touch your wand to someone else's to combine colors.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
var DELETE_AT_ENDING = false;
|
||||||
|
|
||||||
|
var COLOR_WAND_MODEL_URL = 'http://hifi-public.s3.amazonaws.com/models/color_busters/wand.fbx';
|
||||||
|
var COLOR_WAND_COLLISION_HULL_URL = 'http://hifi-public.s3.amazonaws.com/models/color_busters/wand_collision_hull.obj';
|
||||||
|
var COLOR_WAND_SCRIPT_URL = Script.resolvePath('colorBusterWand.js');
|
||||||
|
|
||||||
|
var COLOR_WAND_DIMENSIONS = {
|
||||||
|
x: 0.04,
|
||||||
|
y: 0.87,
|
||||||
|
z: 0.04
|
||||||
|
};
|
||||||
|
|
||||||
|
var COLOR_WAND_START_POSITION = {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
var STARTING_COLORS = [
|
||||||
|
['red', {
|
||||||
|
red: 255,
|
||||||
|
green: 0,
|
||||||
|
blue: 0
|
||||||
|
}],
|
||||||
|
['yellow', {
|
||||||
|
red: 255,
|
||||||
|
green: 255,
|
||||||
|
blue: 0
|
||||||
|
}],
|
||||||
|
['blue', {
|
||||||
|
red: 0,
|
||||||
|
green: 0,
|
||||||
|
blue: 255
|
||||||
|
}]
|
||||||
|
];
|
||||||
|
|
||||||
|
var center = Vec3.sum(Vec3.sum(MyAvatar.position, {
|
||||||
|
x: 0,
|
||||||
|
y: 0.5,
|
||||||
|
z: 0
|
||||||
|
}), Vec3.multiply(0.5, Quat.getFront(Camera.getOrientation())));
|
||||||
|
|
||||||
|
|
||||||
|
function chooseStartingColor() {
|
||||||
|
var startingColor = STARTING_COLORS[Math.floor(Math.random() * STARTING_COLORS.length)];
|
||||||
|
return startingColor
|
||||||
|
}
|
||||||
|
|
||||||
|
var wand;
|
||||||
|
|
||||||
|
function createColorBusterWand() {
|
||||||
|
var startingColor = chooseStartingColor();
|
||||||
|
var colorBusterWandProperties = {
|
||||||
|
name: 'Hifi-ColorBusterWand',
|
||||||
|
type: 'Model',
|
||||||
|
modelURL: COLOR_WAND_MODEL_URL,
|
||||||
|
shapeType: 'compound',
|
||||||
|
compoundShapeURL: COLOR_WAND_COLLISION_HULL_URL,
|
||||||
|
dimensions: COLOR_WAND_DIMENSIONS,
|
||||||
|
position: center,
|
||||||
|
script: COLOR_WAND_SCRIPT_URL,
|
||||||
|
collisionsWillMove: true,
|
||||||
|
userData: JSON.stringify({
|
||||||
|
hifiColorBusterWandKey: {
|
||||||
|
owner: MyAvatar.sessionUUID,
|
||||||
|
currentColor: startingColor[0],
|
||||||
|
originalColorName: startingColor[0],
|
||||||
|
colorLocked: false
|
||||||
|
},
|
||||||
|
grabbableKey: {
|
||||||
|
invertSolidWhileHeld: false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
};
|
||||||
|
|
||||||
|
wand = Entities.addEntity(colorBusterWandProperties);
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteWand() {
|
||||||
|
Entities.deleteEntity(wand);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DELETE_AT_ENDING === true) {
|
||||||
|
Script.scriptEnding.connect(deleteWand);
|
||||||
|
}
|
||||||
|
|
||||||
|
createColorBusterWand();
|
Loading…
Reference in a new issue