Andrew Meadowsarchive remaining JS scriptsc0b446c10 years agoHistory
270 lines · 5.3 KB · JavaScript
RawDownload
////  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);