UNPKG

inertialrush-game-test

Version:

This package enables the integration of the Inertial Rush game into any React application, making it easy to showcase the game.

179 lines (150 loc) 4.22 kB
/* * HexGL * @author Thibaut 'BKcore' Despoulain <http://bkcore.com> * @license This work is licensed under the Creative Commons Attribution-NonCommercial 3.0 Unported License. * To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/3.0/. */ var bkcore = bkcore || {}; bkcore.hexgl = bkcore.hexgl || {}; bkcore.hexgl.CameraChase = function(opts) { var domElement = opts.ctx.document; var self = this; this.dir = new THREE.Vector3(0,0,1); this.up = new THREE.Vector3(0,1,0); this.target = new THREE.Vector3(); this.speedOffset = 0; this.speedOffsetMax = 10; this.speedOffsetStep = 0.05; this.modes = { CHASE: 0, ORBIT: 1 } this.mode = this.modes.CHASE; this.camera = opts.camera; this.targetObject = opts.target; this.cameraCube = opts.cameraCube == undefined ? null : opts.cameraCube; this.yoffset = opts.yoffest == undefined ? 8.0 : opts.yoffest; this.zoffset = opts.zoffset == undefined ? 10.0 : opts.zoffset; this.viewOffset = opts.viewOffset == undefined ? 10.0 : opts.viewOffset; this.orbitOffset = 12; this.lerp = opts.lerp == undefined ? 0.5 : opts.lerp; this.time = 0.0; this.key = { forward: false, backward: false, left: false, right: false, ltrigger: false, rtrigger: false, use: false }; function onKeyDown(event) { switch (event.keyCode) { case 38: /*up*/ self.key.forward = true; break; case 40: /*down*/ self.key.backward = true; break; case 37: /*left*/ self.key.left = true; break; case 39: /*right*/ self.key.right = true; break; case 81: /*Q*/ self.key.ltrigger = true; break; case 65: /*A*/ self.key.ltrigger = true; break; case 68: /*D*/ self.key.rtrigger = true; break; case 69: /*E*/ self.key.rtrigger = true; break; } } function onKeyUp(event) { switch (event.keyCode) { case 38: /*up*/ self.key.forward = false; break; case 40: /*down*/ self.key.backward = false; break; case 37: /*left*/ self.key.left = false; break; case 39: /*right*/ self.key.right = false; break; case 81: /*Q*/ self.key.ltrigger = false; break; case 65: /*A*/ self.key.ltrigger = false; break; case 68: /*D*/ self.key.rtrigger = false; break; case 69: /*E*/ self.key.rtrigger = false; break; } } domElement.addEventListener('keydown', onKeyDown, false); domElement.addEventListener('keyup', onKeyUp, false); } bkcore.hexgl.CameraChase.prototype.update = function(dt, ratio) { if(this.mode == this.modes.CHASE) { this.dir.set(0,0,1); this.up.set(0,1,0); this.up.transformDirection(this.targetObject.matrix); this.dir.transformDirection(this.targetObject.matrix); this.speedOffset += (this.speedOffsetMax*ratio - this.speedOffset) * Math.min(1, 0.3*dt); this.target.copy(this.targetObject.position); this.target.sub(this.dir.multiplyScalar(this.zoffset + this.speedOffset)); this.target.add(this.up.multiplyScalar(this.yoffset)); this.target.y += -this.up.y + this.yoffset; this.camera.position.copy(this.target); this.camera.lookAt(this.dir.normalize().multiplyScalar(this.viewOffset).add(this.targetObject.position)); } else if(this.mode == this.modes.ORBIT) { this.time += dt*.008; this.dir.set( Math.cos(this.time)*this.orbitOffset, this.yoffset/2, Math.sin(this.time)*this.orbitOffset ); this.target.copy(this.targetObject.position).add(this.dir); this.camera.position.copy(this.target); this.camera.lookAt(this.targetObject.position); } if(this.cameraCube != null) this.cameraCube.rotation.copy(this.camera.rotation); /*if(this.key.forward){ this.camera.position.y+=1; } if(this.key.backward){ this.camera.position.y-=1; } if(this.key.left){ this.camera.position.x-=1; } if(this.key.right){ this.camera.position.x+=1; } if(this.key.ltrigger){ this.camera.position.z-=1; } if(this.key.rtrigger){ this.camera.position.z+=1; } console.log(this.camera.position);*/ }