camera = new THREE.PerspectiveCamera( 60, sceneWidth / sceneHeight, 0.1, 1000 );//perspective camera
renderer = new THREE.WebGLRenderer({alpha:true});//renderer with transparent backdrop
renderer.shadowMap.enabled = true;//enable shadow
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
//...
hero = new THREE.Mesh( heroGeometry, heroMaterial );
hero.castShadow=true;
hero.receiveShadow=false;
//...
ground.receiveShadow = true;
ground.castShadow=false;
//..
sun = new THREE.DirectionalLight( 0xffffff, 0.8);
sun.position.set( 0,4,1 );
sun.castShadow = true;
scene.add(sun);
//Set up shadow properties for the sun light
sun.shadow.mapSize.width = 256;
sun.shadow.mapSize.height = 256;
sun.shadow.camera.near = 0.5;
sun.shadow.camera.far = 50 ;
scene = new THREE.Scene();
scene.fog = new THREE.FogExp2( 0xf0fff0, 0.14 );
camera = new THREE.PerspectiveCamera( 60, sceneWidth / sceneHeight, 0.1, 1000 );//perspective camera
renderer = new THREE.WebGLRenderer({alpha:true});//renderer with transparent backdrop
renderer.setClearColor(0xfffafa, 1);
var hemisphereLight = new THREE.HemisphereLight(0xfffafa,0x000000, .9)
scene.add(hemisphereLight);
sun = new THREE.DirectionalLight( 0xcdc1c5, 0.9);
sun.position.set( 12,6,-7 );
sun.castShadow = true;
scene.add(sun);
var sphereGeometry = new THREE.DodecahedronGeometry( heroRadius, 1);
var sphereMaterial = new THREE.MeshStandardMaterial( { color: 0xe5f2f2 ,shading:THREE.FlatShading} )
heroSphere = new THREE.Mesh( sphereGeometry, sphereMaterial );
var sides=40;
var tiers=40;
var sphereGeometry = new THREE.SphereGeometry( worldRadius, sides,tiers);
var sphereMaterial = new THREE.MeshStandardMaterial( { color: 0xfffafa ,shading:THREE.FlatShading} )
var vertexIndex;
var vertexVector= new THREE.Vector3();
var nextVertexVector= new THREE.Vector3();
var firstVertexVector= new THREE.Vector3();
var offset= new THREE.Vector3();
var currentTier=1;
var lerpValue=0.5;
var heightValue;
var maxHeight=0.07;
for(var j=1;j1.005){
explosionPower-=0.001;
}else{
particles.visible=false;
}
particleGeometry.verticesNeedUpdate = true;
}
function update(){
rollingGroundSphere.rotation.x += rollingSpeed;
heroSphere.rotation.x -= heroRollingSpeed;
if(heroSphere.position.y<=heroBaseY){
jumping=false;
bounceValue=(Math.random()*0.04)+0.005;
}
heroSphere.position.y+=bounceValue;
heroSphere.position.x=THREE.Math.lerp(heroSphere.position.x,currentLane, 2*clock.getDelta());//clock.getElapsedTime());
bounceValue-=gravity;
if(clock.getElapsedTime()>treeReleaseInterval){
clock.start();
addPathTree();
if(!hasCollided){
score+=2*treeReleaseInterval;
scoreText.innerHTML=score.toString();
}
}
doTreeLogic();
doExplosionLogic();
render();
requestAnimationFrame(update);//request next update
}
function render(){
renderer.render(scene, camera);//draw
function addWorldTrees(){
var numTrees=36;
var gap=6.28/36;
for(var i=0;i0.5){
lane= Math.floor(Math.random()*2);
addTree(true,options[lane]);
}
}
document.onkeydown = handleKeyDown;
//..
function handleKeyDown(keyEvent){
if(jumping)return;
var validMove=true;
if ( keyEvent.keyCode === 37) {//left
if(currentLane==middleLane){
currentLane=leftLane;
}else if(currentLane==rightLane){
currentLane=middleLane;
}else{
validMove=false;
}
} else if ( keyEvent.keyCode === 39) {//right
if(currentLane==middleLane){
currentLane=rightLane;
}else if(currentLane==leftLane){
currentLane=middleLane;
}else{
validMove=false;
}
}else{
if ( keyEvent.keyCode === 38){//up, jump
bounceValue=0.1;
jumping=true;
}
validMove=false;
}
if(validMove){
jumping=true;
bounceValue=0.06;
}
}
function doTreeLogic(){
var oneTree;
var treePos = new THREE.Vector3();
treesInPath.forEach( function ( element, index ) {
oneTree=treesInPath[ index ];
treePos.setFromMatrixPosition( oneTree.matrixWorld );
if(treePos.distanceTo(heroSphere.position)<=0.6){
console.log("hit");
hasCollided=true;
explode();
}
});
//..
}
var treesToRemove=[];
treesInPath.forEach( function ( element, index ) {
oneTree=treesInPath[ index ];
treePos.setFromMatrixPosition( oneTree.matrixWorld );
if(treePos.z>6 &&oneTree.visible){//gone out of our view zone
treesToRemove.push(oneTree);
}
});
var fromWhere;
treesToRemove.forEach( function ( element, index ) {
oneTree=treesToRemove[ index ];
fromWhere=treesInPath.indexOf(oneTree);
treesInPath.splice(fromWhere,1);
treesPool.push(oneTree);
oneTree.visible=false;
console.log("remove tree");
});