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"); });