//// easyStarExample.js//// Created by James B. Pollack @imgntn on 11/9/2015// Copyright 2015 High Fidelity, Inc.//// This is a script that sets up a grid of obstacles and passable tiles, finds a path, and then moves an entity along the path.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // To-Do:// Abstract start position and make tiles, spheres, etc. relative// Handle dynamically changing grids Script.include('easyStar.js');var easystar = loadEasyStar();Script.include('tween.js');var TWEEN = loadTween(); var ANIMATION_DURATION = 350;var grid = [ [0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0, 1, 1], [0, 0, 1, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0]]; easystar.setGrid(grid); easystar.setAcceptableTiles([0]);easystar.enableCornerCutting();easystar.findPath(0, 0, 8, 0, function(path) { if (path === null) { print("Path was not found."); Script.update.disconnect(tickEasyStar); } else { print('path' + JSON.stringify(path)); convertPath(path); Script.update.disconnect(tickEasyStar); }}); var tickEasyStar = function() { easystar.calculate();} Script.update.connect(tickEasyStar); //a sphere that will get movedvar playerSphere = Entities.addEntity({ type: 'Sphere', shape: 'Sphere', color: { red: 255, green: 0, blue: 0 }, dimensions: { x: 0.5, y: 0.5, z: 0.5 }, position: { x: 0, y: 0, z: 0 }, gravity: { x: 0, y: -9.8, z: 0 }, dynamic: true, damping: 0.2}); Script.setInterval(function(){ Entities.editEntity(playerSphere,{ velocity:{ x:0, y:4, z:0 } })},1000) var sphereProperties; //for keeping track of entitiesvar obstacles = [];var passables = []; function createPassableAtTilePosition(posX, posY) { var properties = { type: 'Box', shapeType: 'Box', dimensions: { x: 1, y: 1, z: 1 }, position: { x: posY, y: -1, z: posX }, color: { red: 0, green: 0, blue: 255 } }; var passable = Entities.addEntity(properties); passables.push(passable);} function createObstacleAtTilePosition(posX, posY) { var properties = { type: 'Box', shapeType: 'Box', dimensions: { x: 1, y: 2, z: 1 }, position: { x: posY, y: 0, z: posX }, color: { red: 0, green: 255, blue: 0 } }; var obstacle = Entities.addEntity(properties); obstacles.push(obstacle);} function createObstacles(grid) { grid.forEach(function(row, rowIndex) { row.forEach(function(v, index) { if (v === 1) { createObstacleAtTilePosition(rowIndex, index); } if (v === 0) { createPassableAtTilePosition(rowIndex, index); } }) })} createObstacles(grid); var currentSpherePosition = { x: 0, y: 0, z: 0}; function convertPathPointToCoordinates(x, y) { return { x: y, z: x };} var convertedPath = []; //convert our path to Vec3sfunction convertPath(path) { path.forEach(function(point) { var convertedPoint = convertPathPointToCoordinates(point.x, point.y); convertedPath.push(convertedPoint); }); createTweenPath(convertedPath);} function updatePosition() { sphereProperties = Entities.getEntityProperties(playerSphere, "position"); Entities.editEntity(playerSphere, { position: { x: currentSpherePosition.z, y: sphereProperties.position.y, z: currentSpherePosition.x } });} var upVelocity = { x: 0, y: 2.5, z: 0} var noVelocity = { x: 0, y: -3.5, z: 0} function createTweenPath(convertedPath) { var i; var stepTweens = []; var velocityTweens = []; //create the tweens for (i = 0; i < convertedPath.length - 1; i++) { var stepTween = new TWEEN.Tween(currentSpherePosition).to(convertedPath[i + 1], ANIMATION_DURATION).onUpdate(updatePosition).onComplete(tweenStep); stepTweens.push(stepTween); } var j; //chain one tween to the next for (j = 0; j < stepTweens.length - 1; j++) { stepTweens[j].chain(stepTweens[j + 1]); } //start the tween stepTweens[0].start(); } var velocityShaper = { x: 0, y: 0, z: 0} function tweenStep() { // print('step between tweens')} function updateTweens() { //hook tween updates into our update loop TWEEN.update();} Script.update.connect(updateTweens); function cleanup() { while (obstacles.length > 0) { Entities.deleteEntity(obstacles.pop()); } while (passables.length > 0) { Entities.deleteEntity(passables.pop()); } Entities.deleteEntity(playerSphere); Script.update.disconnect(updateTweens);} Script.scriptEnding.connect(cleanup);
//
// easyStarExample.js
//
// Created by James B. Pollack @imgntn on 11/9/2015
// Copyright 2015 High Fidelity, Inc.
//
// This is a script that sets up a grid of obstacles and passable tiles, finds a path, and then moves an entity along the path.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
// To-Do:
// Abstract start position and make tiles, spheres, etc. relative
// Handle dynamically changing grids
Script.include('easyStar.js');
var easystar = loadEasyStar();
Script.include('tween.js');
var TWEEN = loadTween();
var ANIMATION_DURATION = 350;
var grid = [
[0, 0, 1, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 0, 1, 0, 1, 0, 0],
[0, 0, 1, 0, 0, 0, 0, 1, 1],
[0, 0, 1, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0]
];
easystar.setGrid(grid);
easystar.setAcceptableTiles([0]);
easystar.enableCornerCutting();
easystar.findPath(0, 0, 8, 0, function(path) {
if (path === null) {
print("Path was not found.");
Script.update.disconnect(tickEasyStar);
} else {
print('path' + JSON.stringify(path));
convertPath(path);
Script.update.disconnect(tickEasyStar);
}
});
var tickEasyStar = function() {
easystar.calculate();
}
Script.update.connect(tickEasyStar);
//a sphere that will get moved
var playerSphere = Entities.addEntity({
type: 'Sphere',
shape: 'Sphere',
color: {
red: 255,
green: 0,
blue: 0
},
dimensions: {
x: 0.5,
y: 0.5,
z: 0.5
},
position: {
x: 0,
y: 0,
z: 0
},
gravity: {
x: 0,
y: -9.8,
z: 0
},
dynamic: true,
damping: 0.2
});
Script.setInterval(function(){
Entities.editEntity(playerSphere,{
velocity:{
x:0,
y:4,
z:0
}
})
},1000)
var sphereProperties;
//for keeping track of entities
var obstacles = [];
var passables = [];
function createPassableAtTilePosition(posX, posY) {
var properties = {
type: 'Box',
shapeType: 'Box',
dimensions: {
x: 1,
y: 1,
z: 1
},
position: {
x: posY,
y: -1,
z: posX
},
color: {
red: 0,
green: 0,
blue: 255
}
};
var passable = Entities.addEntity(properties);
passables.push(passable);
}
function createObstacleAtTilePosition(posX, posY) {
var properties = {
type: 'Box',
shapeType: 'Box',
dimensions: {
x: 1,
y: 2,
z: 1
},
position: {
x: posY,
y: 0,
z: posX
},
color: {
red: 0,
green: 255,
blue: 0
}
};
var obstacle = Entities.addEntity(properties);
obstacles.push(obstacle);
}
function createObstacles(grid) {
grid.forEach(function(row, rowIndex) {
row.forEach(function(v, index) {
if (v === 1) {
createObstacleAtTilePosition(rowIndex, index);
}
if (v === 0) {
createPassableAtTilePosition(rowIndex, index);
}
})
})
}
createObstacles(grid);
var currentSpherePosition = {
x: 0,
y: 0,
z: 0
};
function convertPathPointToCoordinates(x, y) {
return {
x: y,
z: x
};
}
var convertedPath = [];
//convert our path to Vec3s
function convertPath(path) {
path.forEach(function(point) {
var convertedPoint = convertPathPointToCoordinates(point.x, point.y);
convertedPath.push(convertedPoint);
});
createTweenPath(convertedPath);
}
function updatePosition() {
sphereProperties = Entities.getEntityProperties(playerSphere, "position");
Entities.editEntity(playerSphere, {
position: {
x: currentSpherePosition.z,
y: sphereProperties.position.y,
z: currentSpherePosition.x
}
});
}
var upVelocity = {
x: 0,
y: 2.5,
z: 0
}
var noVelocity = {
x: 0,
y: -3.5,
z: 0
}
function createTweenPath(convertedPath) {
var i;
var stepTweens = [];
var velocityTweens = [];
//create the tweens
for (i = 0; i < convertedPath.length - 1; i++) {
var stepTween = new TWEEN.Tween(currentSpherePosition).to(convertedPath[i + 1], ANIMATION_DURATION).onUpdate(updatePosition).onComplete(tweenStep);
stepTweens.push(stepTween);
}
var j;
//chain one tween to the next
for (j = 0; j < stepTweens.length - 1; j++) {
stepTweens[j].chain(stepTweens[j + 1]);
}
//start the tween
stepTweens[0].start();
}
var velocityShaper = {
x: 0,
y: 0,
z: 0
}
function tweenStep() {
// print('step between tweens')
}
function updateTweens() {
//hook tween updates into our update loop
TWEEN.update();
}
Script.update.connect(updateTweens);
function cleanup() {
while (obstacles.length > 0) {
Entities.deleteEntity(obstacles.pop());
}
while (passables.length > 0) {
Entities.deleteEntity(passables.pop());
}
Entities.deleteEntity(playerSphere);
Script.update.disconnect(updateTweens);
}
Script.scriptEnding.connect(cleanup);