// Cloned by Enhanced on 13 Jun 2018 from World "Space hero in threeworld" by Mathias Bazin
// Please leave this clone trail here.
// Customise AB run parameters (optional).
// The following 3 parameters can be customised. (They have default values.)
//===============================================================
//Comments:
// Adapted the game to fit the threeworld object. Add audio and visual feedback through the game and mouse hides when playing.
//===============================================================
threeworld.drawCameraControls = false;
AB.drawRunControls = false;
AB.clockTick = 20;
// Speed of run: Step every n milliseconds. Default 100.
AB.maxSteps = 10000;
// Length of run: Maximum length of run in steps. Default 1000.
AB.screenshotStep = 50;
// For automatic generation of World images.
// Take screenshot on this step. (All resources should have finished loading.) Default 50.
function World() {
// length of a run before final score
//
const ACTION_LEFT = 0;
const ACTION_RIGHT = 1;
const ACTION_UP = 2;
const ACTION_DOWN = 3;
const ACTION_STAYSTILL = 4;
const COLLISIONAUDIO = "/uploads/mathias/boom.mp3";
const DIFFUPAUDIO = "/uploads/mathias/diffUp.mp3"
const startRadiusConst = 100
const maxRadiusConst = 1000
const SKYCOLOR = 0x000000;
var player, gem;
var mouse = new THREE.Vector2();
var enemies = [];
var enemySpeed = 3;
var scoreDiv = document.getElementById( "score" );
var bestScoreDiv = document.getElementById( "bestScore" );
var sphereRadius = 10;
var enemyRangeX = 550;
var enemyRangeY = 700;
var gemRange = 700;
var score = 0;
var best = 0;
var stars = [];
var starSpeed = 8;
var difficulty = 0;
var timeToShake = 0;
var canvas = document.getElementById("ab-runcanvas");
var camPos = new THREE.Vector3(0,0,600);
var camLook = new THREE.Vector3(0,0,-1000);
var self = this; // needed for private fn to call public fn - see below
function shakeCamera()
{
if (timeToShake == 0)
{
camPos.x = 0;
camPos.y = 0;
}
else if ( timeToShake > 0 )
{
camPos.x += randomintAtoB(-20,20);
camPos.y += randomintAtoB(-20,20);
timeToShake--;
console.log(camPos.x, camPos.y, camPos.z);
}
threeworld.follow = camPos;
threeworld.lookat = camLook;
}
function randomfloatAtoB ( A, B )
{
return ( A + ( Math.random() * (B-A) ) );
}
function randomintAtoB ( A, B )
{
return ( Math.round ( randomfloatAtoB ( A, B ) ) );
}
// function onMouseMove(event)
// {
// // Update the mouse variable
// event.preventDefault();
// mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
// mouse.y = - (event.clientY / window.innerHeight) * 2 + 1;
// console.log("mouse x :", mouse.x);
// // Make the sphere follow the mouse
// var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5);
// vector.unproject( threeworld.camera );
// var dir = vector.sub( threeworld.camera.position ).normalize();
// var distance = - threeworld.camera.position.z / dir.z;
// var pos = threeworld.camera.position.clone().add( dir.multiplyScalar( distance ) );
// theagent.position.copy(pos);
// // Make the sphere follow the mouse
// // mouseMesh.position.set(event.clientX, event.clientY, 0);
// }
function initDrag ( x, y ) // x,y position on screen
{
startX = x;
startY = y;
dragevents = 0;
}
function drag ( x, y )
{
// console.log("fene", $(window).height());
theagent.position.x = x - $(window).width()/2;
theagent.position.y = -y + $(document).height()/2;
// console.log("mouse",x,y);
// console.log("agent", theagent.position.x, theagent.position.y);
$('html').css({cursor: 'none'});
dragevents++;
startX = x;
startY = y;
}
function onMouseUp(){
console.log("yeq")
$('html').css({cursor: 'auto'});
}
this.newRun = function()
{
threeworld.init3d ( startRadiusConst, maxRadiusConst, SKYCOLOR );
// threeworld.camera.position.z = 600;
threeworld.follow = camPos;
threeworld.lookat = camLook;
threeworld.cameraMove();
enemies = [];
stars = [];
enemyRangeX = 550;
enemyRangeY = 700;
gemRange = 500;
geometry = new THREE.SphereGeometry( 15, 20, 20 );
material = new THREE.MeshLambertMaterial( { map: THREE.ImageUtils.loadTexture('/uploads/rossfraney3/rock.jpg' )} );
geometry2 = new THREE.SphereGeometry( 3, 3, 3 );
material2 = new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture('/uploads/rossfraney3/glass.jpg' )} );
radius = 1000;
nboxes = 50;
for(var i = 0; i<nboxes; i++){
var cube = new THREE.Mesh( geometry, material );
cube.castShadow = false;
cube.receiveShadow = false;
threeworld.scene.add( cube );
cube.position.set(radius/2 - radius * Math.random(), radius/2 - radius * Math.random(), 0.0);
enemies.push( cube );
}
for(var i = 0; i<nboxes*2; i++){
var star = new THREE.Mesh( geometry2, material2 );
threeworld.scene.add( star );
star.position.set(radius/2 - radius * Math.random(), radius/2 - radius * Math.random(), 0.0);
stars.push( star );
}
//
gem = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial({map: THREE.ImageUtils.loadTexture('/uploads/rossfraney3/fire.jpg'), side:THREE.FrontSide}));
gem.position.set( gemRange/2 - gemRange * Math.random(),gemRange/2 - gemRange * Math.random(),0.0);
gem.castShadow = false;
gem.receiveShadow = false;
threeworld.scene.add( gem );
theagent = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial({map: THREE.ImageUtils.loadTexture('/uploads/rossfraney3/earthbare.jpg'), side:THREE.FrontSide}) );
threeworld.scene.add( theagent );
// window.addEventListener( 'mousemove', onMouseMove, false );
var skyGeometry = new THREE.SphereGeometry ( 3000, 60, 40 );
var uniforms = {
texture: { type: 't', value: THREE.ImageUtils.loadTexture('sky.jpg')}
};
var skyMaterial = new THREE.MeshBasicMaterial({ map: THREE.ImageUtils.loadTexture('/uploads/rossfraney3/ESO.jpg')});
var theskybox = new THREE.Mesh ( skyGeometry, skyMaterial );
theskybox.scale.set(-5, 5, 5);
theskybox.eulerOrder = 'XYZ'
theskybox.renderDepth = 500.0;
threeworld.scene.add( theskybox );
var light = new THREE.PointLight(0xffffff);
light.position.set(0,250,0);
threeworld.scene.add(light); //add light to world (From a nearby star, obviously)
var x = "<audio id=theaudio src=/uploads/starter/SuspenseStrings.mp3 autoplay loop> </audio>" ;
$("#user_span2").html( x );
threehandler.initMouseDrag = initDrag;
threehandler.mouseDrag = drag
document.addEventListener("click", onMouseUp);
// canvas.addEventListener("mouseup", onMouseUp);
};
this.nextStep = function()
{
// Code for Three.js re-drawing of objects.
for( var i = 0; i < enemies.length; i++ ){
if(enemies[i].position.y < -500){
//enemies[i].position.x = enemyRangeX/2 - enemyRangeX * Math.random();
enemies[i].position.y = 500;
}
else{
if ( enemies[i].position.distanceTo( theagent.position ) < 2 * sphereRadius) { // if there's a player-enemy collision
timeToShake = 10;
score = 0;
let boom = new Audio( COLLISIONAUDIO );
boom.play();
enemySpeed = 3;
starSpeed = 8;
difficulty = 0;
enemies[i].position.set(radius/2 - radius * Math.random(), radius/2 - radius * Math.random(), 0.0)
gem.position.x = gemRange/2 - gemRange * Math.random();
gem.position.y = gemRange/2 - gemRange * Math.random();
}
enemies[i].position.y -= enemySpeed;
}
}
for( var i = 0; i < stars.length; i++ ){
if(stars[i].position.y < -500){
stars[i].position.y = 500;
}
stars[i].position.y -= starSpeed;
}
gem.rotation.y += .02;
theagent.rotation.x += .002;
theagent.rotation.y += .02;
var status = " <center> <b> Collect the Suns. For each multiple of 5 difficulty will increase.</b></BR>Score: " + score + "   Best Score: " + best + "   Difficulty Level: " + difficulty + "</center>";
$("#user_span4").html( status );
if(theagent.position.distanceTo( gem.position ) < 2 * sphereRadius){ //agent grabs sun
gem.position.x = gemRange/2 - gemRange * Math.random();
gem.position.y = gemRange/2 - gemRange * Math.random();
score ++;
var y = "<audio id=theaudio src=/uploads/rossfraney3/elevatording.mp3 autoplay > </audio>" ;
$("#user_span3").html( y );
if(score % 5 == 0){ //difficulty up !
let diffUpAudio = new Audio( DIFFUPAUDIO );
diffUpAudio.play()
enemySpeed++;
starSpeed++;
difficulty++;
}
if(score > best){
best = score;
}
}
shakeCamera();
};
}