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
JavaScript
/*
* 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);*/
}