202 lines · 4.4 KB · JavaScript
RawDownload
//  blockWorld.js//  examples////  Created by Eric Levin on May 26, 2015//  Copyright 2015 High Fidelity, Inc.////  Creates a floor of tiles and then drops planky blocks at random points above the tile floor////  Distributed under the Apache License, Version 2.0.//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// var TILE_SIZE = 7var GENERATE_INTERVAL = 50;var NUM_ROWS = 10;var angVelRange = 4; var floorTiles = [];var blocks = [];var blockSpawner;  var OVERTE_PUBLIC_CDN = networkingConstants.PUBLIC_BUCKET_CDN_URL;  var floorPos = Vec3.sum(MyAvatar.position, {  x: 0,  y: -2,  z: 0});var x = floorPos.x; var currentRowIndex = 0;var currentColumnIndex = 0; var DROP_HEIGHT = floorPos.y + 5;var BLOCK_GRAVITY = {  x: 0,  y: -9,  z: 0};var BLOCK_SIZE = {  x: 0.2,  y: 0.1,  z: 0.8}; var bounds = {  xMin: floorPos.x,  xMax: floorPos.x + (TILE_SIZE * NUM_ROWS) - TILE_SIZE,  zMin: floorPos.z,  zMax: floorPos.z + (TILE_SIZE * NUM_ROWS) - TILE_SIZE}; var screenSize = Controller.getViewportDimensions(); var BUTTON_SIZE = 32;var PADDING = 3; var offButton = Overlays.addOverlay("image", {  x: screenSize.x / 2 - BUTTON_SIZE * 2 + PADDING,  y: screenSize.y - (BUTTON_SIZE + PADDING),  width: BUTTON_SIZE,  height: BUTTON_SIZE,  imageURL: OVERTE_PUBLIC_CDN + "images/close.png",  color: {    red: 255,    green: 255,    blue: 255  },  alpha: 1}); var deleteButton = Overlays.addOverlay("image", {  x: screenSize.x / 2 - BUTTON_SIZE,  y: screenSize.y - (BUTTON_SIZE + PADDING),  width: BUTTON_SIZE,  height: BUTTON_SIZE,  imageURL: OVERTE_PUBLIC_CDN + "images/delete.png",  color: {    red: 255,    green: 255,    blue: 255  },  alpha: 1});  function generateFloor() {  for (var z = floorPos.z; currentColumnIndex < NUM_ROWS; z += TILE_SIZE, currentColumnIndex++) {    floorTiles.push(Entities.addEntity({      type: 'Box',      position: {        x: x,        y: floorPos.y,        z: z      },      dimensions: {        x: TILE_SIZE,        y: 2,        z: TILE_SIZE      },      color: {        red: randFloat(70, 120),        green: randFloat(70, 71),        blue: randFloat(70, 80)      },      // dynamic: true    }));  }   currentRowIndex++;  if (currentRowIndex < NUM_ROWS) {    currentColumnIndex = 0;    x += TILE_SIZE;    Script.setTimeout(generateFloor, GENERATE_INTERVAL);  } else {    //Once we're done generating floor, drop planky blocks at random points on floor    blockSpawner = Script.setInterval(function() {      dropBlock();    }, GENERATE_INTERVAL)  }} function dropBlock() {  var dropPos = floorPos;  dropPos.y = DROP_HEIGHT;  dropPos.x = randFloat(bounds.xMin, bounds.xMax);  dropPos.z = randFloat(bounds.zMin, bounds.zMax);  blocks.push(Entities.addEntity({    type: "Model",    modelURL: 'http://s3.amazonaws.com/hifi-public/marketplace/hificontent/Games/blocks/block.fbx',    shapeType: 'box',    position: dropPos,    dimensions: BLOCK_SIZE,    dynamic: true,    gravity: {      x: 0,      y: -9,      z: 0    },    velocity: {      x: 0,      y: .1,      z: 0    },    angularVelocity: {      x: randFloat(-angVelRange, angVelRange),      y: randFloat(-angVelRange, angVelRange),      z: randFloat(-angVelRange, angVelRange),    }  }));} function mousePressEvent(event) {  var clickedOverlay = Overlays.getOverlayAtPoint({    x: event.x,    y: event.y  });  if (clickedOverlay == offButton) {    Script.clearInterval(blockSpawner);  }   if(clickedOverlay == deleteButton){    destroyStuff();  }} generateFloor(); function cleanup() {  // for (var i = 0; i < floorTiles.length; i++) {  //   Entities.deleteEntity(floorTiles[i]);  // }  // for (var i = 0; i < blocks.length; i++) {  //   Entities.deleteEntity(blocks[i]);  // }  Overlays.deleteOverlay(offButton);  Overlays.deleteOverlay(deleteButton)  Script.clearInterval(blockSpawner);} function destroyStuff() {  for (var i = 0; i < floorTiles.length; i++) {    Entities.deleteEntity(floorTiles[i]);  }  for (var i = 0; i < blocks.length; i++) {    Entities.deleteEntity(blocks[i]);  }  Script.clearInterval(blockSpawner); } function randFloat(low, high) {  return Math.floor(low + Math.random() * (high - low));} function map(value, min1, max1, min2, max2) {  return min2 + (max2 - min2) * ((value - min1) / (max1 - min1));} Script.scriptEnding.connect(cleanup);Controller.mousePressEvent.connect(mousePressEvent);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t