three打造给狮子吹风的交互游戏效果
代码语言:html
所属分类:游戏
代码描述:three打造给狮子吹风的交互游戏效果,点击鼠标左键拖动位置给狮子吹吹风
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> @import url(https://fonts.googleapis.com/css?family=Open+Sans:800); #world { background: #ebe5e7; position:absolute; width:100%; height:100%; overflow:hidden; } #instructions{ position:absolute; width:100%; top:50%; margin: auto; margin-top:120px; font-family:'Open Sans', sans-serif; color:#653f4c; font-size:.9em; text-transform: uppercase; text-align : center; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .lightInstructions { color:#993f4c; font-size:.8em; } #credits{ position:absolute; width:100%; margin: auto; bottom:0; margin-bottom:20px; font-family:'Open Sans', sans-serif; color:#b297a2; font-size:0.7em; text-transform: uppercase; text-align : center; } #credits a { color:#b297a2; } #credits .society6 { color:#993f4c; } </style> </head> <body translate="no"> <div id="world"></div> <div id="instructions">Press and drag to make wind<br /><span class="lightInstructions">the lion will surely appreciate</span></div> <script type="text/javascript" src="http://repo.bfw.wiki/bfwrepo/js/three.72.js"></script> <script src='http://repo.bfw.wiki/bfwrepo/js/OrbitControls.js'></script> <script> //THREEJS RELATED VARIABLES var scene, camera, controls, fieldOfView, aspectRatio, nearPlane, farPlane, shadowLight, backLight, light, renderer, container; //SCENE var floor, lion, fan, isBlowing = false; //SCREEN VARIABLES var HEIGHT, WIDTH, windowHalfX, windowHalfY, mousePos = {x:0,y:0}; dist = 0; //INIT THREE JS, SCREEN AND MOUSE EVENTS function init(){ scene = new THREE.Scene(); HEIGHT = window.innerHeight; WIDTH = window.innerWidth; aspectRatio = WIDTH / HEIGHT; fieldOfView = 60; nearPlane = 1; farPlane = 2000; camera = new THREE.PerspectiveCamera( fieldOfView, aspectRatio, nearPlane, farPlane); camera.position.z = 800; camera.position.y = 0; camera.lookAt(new THREE.Vector3(0,0,0)); renderer = new THREE.WebGLRenderer({alpha: true, antialias: true }); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize(WIDTH, HEIGHT); renderer.shadowMapEnabled = true; container = document.getElementById('world'); container.appendChild(renderer.domElement); windowHalfX = WIDTH / 2; windowHalfY = HEIGHT / 2; window.addEventListener('resize', onWindowResize, false); document.addEventListener('mousemove', handleMouseMove, false); document.addEventListener('mousedown', handleMouseDown, false); document.addEventListener('mouseup', handleMouseUp, false); document.addEventListener('touchstart', handleTouchStart, false); document.addEventListener('touchend', handleTouchEnd, false); document.addEventListener('touchmove',handleTouchMove, false); /* controls = new THREE.OrbitControls( camera, renderer.domElement); //*/ } function onWindowResize() { HEIGHT = window.innerHeight; WIDTH = window.innerWidth; windowHalfX = WIDTH / 2; windowHalfY = HEIGHT / 2; renderer.setSize(WIDTH, HEIGHT); camera.aspect = WIDTH / HEIGHT; camera.updateProjectionMatrix(); } function handleMouseMove(event) { mousePos = {x:event.clientX, y:event.clientY}; } function handleMouseDown(event) { isBlowing = true; } function handleMouseUp(event) { isBlowing = false; } function handleTouchStart(event) { if (event.touches.length > 1) { event.preventDefault(); mousePos = {x:event.touches[0].pageX, y:event.touches[0].pageY}; isBlowing = true; } } function handleTouchEnd(event) { //mousePos = {x:windowHalfX, y:windowHalfY}; isBlowing = false; } function handleTouchMove(event) { if (event.touches.length == 1) { event.preventDefault(); mousePos = {x:event.touches[0].pageX, y:event.touches[0].pageY}; isBlowing = true; } } function createLights() { light = new THREE.HemisphereLight(0xffffff, 0xffffff, .5) shadowLight = new THREE.DirectionalLight(0xffffff, .8); shadowLight.position.set(200, 200, 200); shadowLight.castShadow = true; shadowLight.shadowDarkness = .2; backLight = new THREE.DirectionalLight(0xffffff, .4); backLight.position.set(-100, 200, 50); backLight.shadowDarkness = .1; backLight.castShadow = true; scene.add(backLight); scene.add(light); scene.add(shadowLight); } function createFloor(){ floor = new THREE.Mesh(new THREE.PlaneBufferGeometry(1000,500), new THREE.MeshBasicMaterial({color: 0xebe5e7})); floor.rotation.x = -Math.PI/2; floor.position.y = -100; floor.receiveShadow = true; scene.add(floor); } function createLion(){ lion = new Lion(); scene.add(lion.threegroup); } function createFan(){ fan = new Fan(); fan.threegroup.position.z = 350; scene.add(fan.threegroup); } Fan = function(){ this.isBlowing = false; this.speed = 0; this.acc =0; this.redMat = new THREE.MeshLambertMaterial ({ color: 0xad3525, shading:THREE.FlatShading }); this.greyMat = new THREE.MeshLambertMaterial ({ color: 0x653f4c, shading:THREE.FlatShading }); this.yellowMat = new THREE.MeshLambertMaterial ({ color: 0xfdd276, shading:THREE.FlatShading }); var coreGeom = new THREE.BoxGeometry(10,10,20); var sphereGeom = new THREE.BoxGeometry(10, 10, 3); var propGeom = new THREE.BoxGeometry(10,30,2); propGeom.applyMatrix( new THREE.Matrix4().makeTranslation( 0,25,0) ); this.core = new THREE.Mesh(coreGeom,this.greyMat); // propellers var prop1 = new THREE.Mesh(propGeom, this.redMat); prop1.position.z = 15; var prop2 = prop1.clone(); prop2.rotation.z = Math.PI/2; var prop3 = prop1.clone(); prop3.rotation.z = Math.PI; var prop4 = prop1.clone(); prop4.rotation.z = -Math.PI/2; this.sphere = new THREE.Mesh(sphereGeom, this.yellowMat); this.sphere.position.z = 15; this.propeller = new THREE.Group(); this.propeller.add(prop1); this.propeller.add(prop2); this.propeller.add(prop3); this.propeller.add(prop4); this.threegroup = new THREE.Group(); this.threegroup.add(this.core); this.threegroup.add(this.propeller); this.threegroup.add(this.sphere); } Fan.prototype.update = function(xTarget, yTarget){ this.threegroup.lookAt(new THREE.Vector3(0,80,60)); this.tPosX = rule3(xTarget, -200, 200, -250, 250); this.tPosY = rule3(yTarget, -200, 200, 250, -250); this.threegroup.position.x += (this.tPosX - this.threegroup.position.x) /10; this.threegroup.position.y += (this.tPosY - this.threegroup.position.y) /10; this.targetSpeed = (this.isBlowing) ? .3 : .01; if (this.isBlowing && this.speed < .5){ this.acc +=.001; this.speed += this.acc; }else if (!this.isBlowing){ this.acc = 0; this.speed *= .98; } this.propeller.rotation.z += this.speed; } Lion = function(){ this.windTime = 0; this.bodyInitPositions = []; this.maneParts = []; this.threegroup = new THREE.Group(); this.yellowMat = new THREE.MeshLambertMaterial ({ color: 0xfdd276, shading:THREE.FlatShading }); this.redMat = new THREE.MeshLambertMaterial ({ color: 0xad3525, shading:THREE.FlatShading }); this.pinkMat = new THREE.MeshLambertMaterial ({ color: 0xe55d2b, shading:THREE.FlatShading }); this.whiteMat = new THREE.MeshLambertMaterial ({ color: 0xffffff, shading:THREE.FlatShading }); this.purpleMat = new THREE.MeshLambertMaterial ({ color: 0x451954, shading:THREE.FlatShading }); this.greyMat = new THREE.MeshLambertMaterial ({ color: 0x653f4c, shading:THREE.FlatShading }); this.blackMat = new THREE.MeshLambertMaterial ({ color: 0x302925, shading:THREE.FlatShading }); var bodyGeom = new THREE.CylinderGeometry(30,80, 140, 4); var maneGeom = new THREE.BoxGeometry(40,40,15); var faceGeom = new THREE.BoxGeometry(80,80,80); var spotGeom = new THREE.BoxGeometry(4,4,4); var mustacheGeom = new THREE.BoxGeometry(30,2,1); mustacheGeom.applyMatrix( new THREE.Matrix4().makeTranslation( 15, 0, 0 ) ); var earGeom = new THREE.BoxGeometry(20,20,20); var noseGeom = new THREE.BoxGeometry(40,40,20); var eyeGeom = new THREE.BoxGeometry(5,30,30); var irisGeom = new THREE.BoxGeometry(4,10,10); var mouthGeom = new THREE.BoxGeometry(20,20,10); var smileGeom = new THREE.TorusGeometry( 12, 4, 2, 10, Math.PI ); var lipsGeom = new THREE.BoxGeometry(40,15,20); var kneeGeom = new THREE.BoxGeometry(25, 80, 80); kneeGeom.applyMatrix( new THREE.Matrix4().makeTranslation( 0, 50, 0 ) ); var footGeom = new THREE.BoxGeometry(40, 20, 20); // body this.body = new THREE.Mesh(bodyGeom, this.yellowMat); this.body.position.z = -60; this.body.position.y = -30; this.bodyVertices = [0,1,2,3,4,10]; for (var i=0;i<this.bodyVertices.length; i++){ var tv = this.body.geometry.vertices[this.bodyVertices[i]]; tv.z =70; //tv.x = 0; this.bodyInitPositions.push({x:tv.x, y:tv.y, z:tv.z}); } // knee this.leftKnee = new THREE.Mesh(kneeGeom, this.yellowMat); this.leftKnee.position.x = 65; this.leftKnee.position.z = -20; this.leftKnee.position.y = -110; this.leftKnee.rotation.z = -.3; this.rightKnee = new THREE.Mesh(kneeGeom, this.yellowMat); this.rightKnee.position.x = -65; this.rightKnee.position.z = -20; this.rightKnee.position.y = -110; this.rightKnee.rotation.z = .3; // feet this.backLeftFoot = new THREE.Mesh(footGeom, this.yellowMat); this.backLeftFoot.position.z = 30; this.backLeftFoot.position.x = 75; this.backLeftFoot.position.y = -90; this.backRightFoot = new THREE.Mesh(footGeom, this.yellowMat); this.backRightFoot.position.z = 30; this.backRightFoot.position.x = -75; this.backRightFoot.position.y = -90; this.frontRightFoot = new THREE.Mesh(footGeom, this.yellowMat); this.frontRightFoot.position.z = 40; this.frontRightFoot.position.x = -22; this.frontRightFoot.position.y = -90; this.frontLeftFoot = new THREE.Mesh(footGeom, this.yellowMat); this.frontLeftFoot.position.z = 40; this.frontLeftFoot.position.x = 22; this.frontLeftFoot.position.y = -90; // mane this.mane = new THREE.Group(); for (var j=0; j<4; j++){ for (var k=0; k<4; k++){ var manePart = new THREE.Mesh(maneGeom, this.redMat); manePart.position.x = (j*40)-60; manePart.position.y = (k*40)-60; var amp; var zOffset; var periodOffset = Math.random()*Math.PI*2; var angleOffsetY, angleOffsetX; var angleAmpY, angleAmpX; var xInit, yInit; if ((j==0 && k==0) || (j==0 && k==3) || (j==3 && k==0) || (j==3 && k==3)){ amp = -10-Math.floor(Math.random()*5); zOffset = -5; }else if (j==0 || k ==0 || j==3 || k==3){ amp = -5-Math.floor(Math.random()*5); zOffset = 0; }else{ amp = 0; zOffset = 0; } this.maneParts.push({mesh:manePart, amp:amp, zOffset:zOffset, perio.........完整代码请登录后点击上方下载按钮下载查看
网友评论0