mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
202 lines
4.4 KiB
JavaScript
202 lines
4.4 KiB
JavaScript
// 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 = 7
|
|
var 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);
|