From 96293c5cde90f2ac548a904f8f282eca0b3305ee Mon Sep 17 00:00:00 2001 From: J08nY Date: Sun, 17 Apr 2016 01:18:44 +0200 Subject: rotation now works/somewhat. --- game.js | 157 +++++++++++++++++++++++++++---------------- game.js.map | 2 +- game.ts | 217 ++++++++++++++++++++++++++++++++++++++++++++---------------- index.html | 2 +- 4 files changed, 262 insertions(+), 116 deletions(-) diff --git a/game.js b/game.js index 481a985..dadd9b4 100644 --- a/game.js +++ b/game.js @@ -72,7 +72,18 @@ var PointerLock = (function () { }()); var Keyboard = (function () { function Keyboard() { + var _this = this; this.status = {}; + this.onKeyDown = function (event) { + var key = Keyboard.keyName(event.keyCode); + if (!_this.status[key]) + _this.status[key] = { down: false, pressed: false, up: false, updatedPreviously: false }; + }; + this.onKeyUp = function (event) { + var key = Keyboard.keyName(event.keyCode); + if (_this.status[key]) + _this.status[key].pressed = false; + }; } Keyboard.prototype.update = function () { for (var key in this.status) { @@ -94,16 +105,6 @@ var Keyboard = (function () { this.status[key].up = true; } }; - Keyboard.prototype.onKeyDown = function (event) { - var key = Keyboard.keyName(event.keyCode); - if (!this.status[key]) - this.status[key] = { down: false, pressed: false, up: false, updatedPreviously: false }; - }; - Keyboard.prototype.onKeyUp = function (event) { - var key = Keyboard.keyName(event.keyCode); - if (this.status[key]) - this.status[key].pressed = false; - }; Keyboard.prototype.down = function (key) { return (this.status[key] && this.status[key].down); }; @@ -114,14 +115,12 @@ var Keyboard = (function () { return (this.status[key] && this.status[key].up); }; Keyboard.prototype.register = function () { - var _this = this; - document.addEventListener("keydown", function (event) { return _this.onKeyDown(event); }, false); - document.addEventListener("keyup", function (event) { return _this.onKeyUp(event); }, false); + document.addEventListener("keydown", this.onKeyDown, false); + document.addEventListener("keyup", this.onKeyUp, false); }; Keyboard.prototype.unregister = function () { - var _this = this; - document.removeEventListener("keydown", function (event) { return _this.onKeyDown(event); }, false); - document.removeEventListener("keyup", function (event) { return _this.onKeyUp(event); }, false); + document.removeEventListener("keydown", this.onKeyDown, false); + document.removeEventListener("keyup", this.onKeyUp, false); }; Keyboard.keyName = function (keyCode) { return (Keyboard.k[keyCode] != null) ? @@ -139,76 +138,108 @@ var Keyboard = (function () { }; return Keyboard; }()); +var MouseButton; +(function (MouseButton) { + MouseButton[MouseButton["LEFT"] = 0] = "LEFT"; + MouseButton[MouseButton["RIGHT"] = 1] = "RIGHT"; + MouseButton[MouseButton["MIDDLE"] = 2] = "MIDDLE"; +})(MouseButton || (MouseButton = {})); var Mouse = (function () { function Mouse() { var _this = this; + this.xMovement = 0; + this.yMovement = 0; + this.buttons = {}; this.onMouseMove = function (event) { _this.x = event.screenX; _this.xMovement = event.movementX; _this.y = event.screenY; _this.yMovement = event.movementY; - console.log(_this.x + " " + _this.y + " :: " + _this.xMovement + " " + _this.yMovement); + // console.log(this.x + " " + this.y + " :: " + this.xMovement + " " + this.yMovement); + }; + this.onMouseDown = function (event) { + _this.buttons[event.button] = true; + }; + this.onMouseUp = function (event) { + _this.buttons[event.button] = false; }; } + Mouse.prototype.pressed = function (button) { + return this.buttons[button]; + }; Mouse.prototype.register = function () { document.addEventListener("mousemove", this.onMouseMove, false); + document.addEventListener("mousedown", this.onMouseDown, false); + document.addEventListener("mouseup", this.onMouseUp, false); }; Mouse.prototype.unregister = function () { document.removeEventListener("mousemove", this.onMouseMove, false); + document.removeEventListener("mousedown", this.onMouseDown, false); + document.removeEventListener("mouseup", this.onMouseUp, false); }; return Mouse; }()); var Morph = (function (_super) { __extends(Morph, _super); - function Morph(faces, material, mass) { - _super.call(this, Morph.generateGeometry(faces), material, mass); - this.faces = faces; + function Morph(level, material, mass) { + _super.call(this, Morph.generateGeometry(level), material, mass); + this.level = level; } - Morph.generateGeometry = function (numFaces) { - if (numFaces == 4) { - return new THREE.TetrahedronGeometry(); + Morph.generateGeometry = function (level) { + var numFaces = Morph.levels[level]; + switch (numFaces) { + case 4: + return new THREE.TetrahedronGeometry(); + case 6: + return new THREE.BoxGeometry(1, 1, 1, 1, 1, 1); + case 12: + return new THREE.DodecahedronGeometry(1, 0); + case 20: + return new THREE.IcosahedronGeometry(1, 0); + default: + return new THREE.TetrahedronGeometry(); } - else if (numFaces == 6) { - return new THREE.BoxGeometry(1, 1, 1, 2, 2, 2); - } - else if (numFaces == 12) { - return new THREE.DodecahedronGeometry(1, 0); - } - else if (numFaces == 20) { - return new THREE.IcosahedronGeometry(1, 0); - } - return null; }; - Morph.prototype.updateGeometry = function (numFaces) { - this.faces = numFaces; - this.geometry = Morph.generateGeometry(this.faces); + Morph.prototype.updateGeometry = function () { + this.geometry = Morph.generateGeometry(this.level); }; - Morph.prototype.shrink = function (numFaces) { - this.updateGeometry(this.faces - numFaces); + Morph.prototype.shrink = function () { + if (this.level > 1) { + this.level--; + this.updateGeometry(); + } }; - Morph.prototype.grow = function (numFaces) { - this.updateGeometry(this.faces + numFaces); + Morph.prototype.grow = function () { + if (this.level < 3) { + this.level++; + this.updateGeometry(); + } }; + Morph.levels = [4, 6, 12, 20]; return Morph; }(Physijs.SphereMesh)); var Enemy = (function (_super) { __extends(Enemy, _super); function Enemy() { - _super.call(this, 6, Physijs.createMaterial(new THREE.MeshBasicMaterial({ + _super.call(this, 0, Physijs.createMaterial(new THREE.MeshBasicMaterial({ color: 0xb02000 - }), .8, .3), 2); + }), .8, .6), 2); } return Enemy; }(Morph)); var Player = (function (_super) { __extends(Player, _super); function Player() { - _super.call(this, 20, Physijs.createMaterial(new THREE.MeshBasicMaterial({ + _super.call(this, 1, Physijs.createMaterial(new THREE.MeshBasicMaterial({ color: 0x00a0b0 - }), .8, .3), 1); + }), .8, .6), 0.5); + this.direction = new Vector3(0, 0, -1); + this.upward = new Vector3(0, 1, 0); + this.camera = new Vector3(0, 10, 10); + this.speed = 15; } Player.prototype.jump = function () { - this.applyCentralImpulse(new Vector3(0, 20, 0)); + this.applyCentralImpulse(new Vector3(0, 8, 0)); }; return Player; }(Morph)); @@ -235,8 +266,8 @@ var World = (function () { light.shadow.bias = -.0001; light.shadow.mapSize.width = light.shadow.mapSize.height = 2048; scene.add(light); - var groundGeometry = new THREE.BoxGeometry(100, 1, 100); - var groundMaterial = Physijs.createMaterial(new THREE.MeshBasicMaterial({ color: 0xeaeaea }), .8, .3); + var groundGeometry = new THREE.BoxGeometry(1000, 1, 1000); + var groundMaterial = Physijs.createMaterial(new THREE.MeshBasicMaterial({ color: 0xdadada }), 1, .6); var ground = new Physijs.BoxMesh(groundGeometry, groundMaterial, 0); scene.add(ground); ground.receiveShadow = true; @@ -279,8 +310,10 @@ var Game = (function () { this.player = new Player(); this.world = new World(this.player, this.scene, this.camera); //init camera - this.camera.position.set(5, 5, 5); + this.camera.position.addVectors(this.player.position, this.player.camera); this.camera.lookAt(this.player.position); + this.playerDirection = new THREE.ArrowHelper(this.player.direction.clone().normalize(), this.player.position, 5); + this.scene.add(this.playerDirection); this.state = GameState.INITIALIZED; }; Game.prototype.onWindowResize = function () { @@ -303,25 +336,35 @@ var Game = (function () { //console.log("tick " + delta); this.ticks++; this.keyboard.update(); + this.camera.position.addVectors(this.player.position, this.player.camera); + if (this.mouse.xMovement != 0) { + this.camera.lookAt(this.player.position); + this.player.direction.applyAxisAngle(this.player.upward, -this.mouse.xMovement / 180); + this.player.camera.applyAxisAngle(this.player.upward, -this.mouse.xMovement / 180); + this.playerDirection.setDirection(this.player.direction); + } + var forward = this.player.direction.clone(); + forward.setLength(this.player.speed); + var right = this.player.direction.clone().cross(this.player.upward); + right.setLength(this.player.speed); if (this.keyboard.pressed("W")) { - this.player.applyCentralForce(new Vector3(0, 0, -10)); + this.player.applyCentralForce(forward); } if (this.keyboard.pressed("S")) { - this.player.applyCentralForce(new Vector3(0, 0, 10)); - } - if (this.keyboard.pressed("A")) { - this.player.applyCentralForce(new Vector3(-10, 0, 0)); + this.player.applyCentralForce(forward.negate()); } if (this.keyboard.pressed("D")) { - this.player.applyCentralForce(new Vector3(10, 0, 0)); + this.player.applyCentralForce(right); + } + if (this.keyboard.pressed("A")) { + this.player.applyCentralForce(right.negate()); } if (this.keyboard.down("space")) { console.log("jump"); this.player.jump(); } - //this.camera.lookAt(this.player.position); - this.camera.position.addVectors(this.player.position, new Vector3(5, 5, 5)); - this.scene.simulate(undefined, 20); + // console.log(this.camera.position.addVectors(this.player.position, this.player.camera)); + this.scene.simulate(undefined, 2); }; Game.prototype.run = function (timestamp) { var _this = this; diff --git a/game.js.map b/game.js.map index 57f25bc..2e760c2 100644 --- a/game.js.map +++ b/game.js.map @@ -1 +1 @@ -{"version":3,"file":"game.js","sourceRoot":"","sources":["game.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"game.js","sourceRoot":"","sources":["game.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/game.ts b/game.ts index 6d7b3f8..f9e4486 100644 --- a/game.ts +++ b/game.ts @@ -114,38 +114,38 @@ class Keyboard { } } - onKeyDown(event) { + onKeyDown = (event:KeyboardEvent) => { var key = Keyboard.keyName(event.keyCode); if (!this.status[key]) this.status[key] = {down: false, pressed: false, up: false, updatedPreviously: false}; - } + }; - onKeyUp(event) { + onKeyUp = (event:KeyboardEvent) => { var key = Keyboard.keyName(event.keyCode); if (this.status[key]) this.status[key].pressed = false; - } + }; - down(key) { + down(key):boolean { return (this.status[key] && this.status[key].down); } - pressed(key) { + pressed(key):boolean { return (this.status[key] && this.status[key].pressed); } - up(key) { + up(key):boolean { return (this.status[key] && this.status[key].up); } register() { - document.addEventListener("keydown", (event) => this.onKeyDown(event), false); - document.addEventListener("keyup", (event) => this.onKeyUp(event), false); + document.addEventListener("keydown", this.onKeyDown, false); + document.addEventListener("keyup", this.onKeyUp, false); } unregister() { - document.removeEventListener("keydown", (event) => this.onKeyDown(event), false); - document.removeEventListener("keyup", (event) => this.onKeyUp(event), false); + document.removeEventListener("keydown", this.onKeyDown, false); + document.removeEventListener("keyup", this.onKeyUp, false); } static keyName(keyCode) { @@ -155,65 +155,99 @@ class Keyboard { } } +enum MouseButton{ + LEFT, + RIGHT, + MIDDLE +} + class Mouse { x:number; y:number; - xMovement:number; - yMovement:number; - private buttons: {}; + xMovement:number = 0; + yMovement:number = 0; + private buttons = {}; constructor() { } - onMouseMove = (event: MouseEvent) => { + onMouseMove = (event:MouseEvent) => { this.x = event.screenX; this.xMovement = event.movementX; this.y = event.screenY; this.yMovement = event.movementY; - console.log(this.x + " " + this.y + " :: " + this.xMovement + " " + this.yMovement); +// console.log(this.x + " " + this.y + " :: " + this.xMovement + " " + this.yMovement); + }; + + onMouseDown = (event:MouseEvent) => { + this.buttons[event.button] = true; }; + onMouseUp = (event:MouseEvent) => { + this.buttons[event.button] = false; + }; + + pressed(button:MouseButton):boolean { + return this.buttons[button]; + } + register() { document.addEventListener("mousemove", this.onMouseMove, false); + document.addEventListener("mousedown", this.onMouseDown, false); + document.addEventListener("mouseup", this.onMouseUp, false); } unregister() { document.removeEventListener("mousemove", this.onMouseMove, false); + document.removeEventListener("mousedown", this.onMouseDown, false); + document.removeEventListener("mouseup", this.onMouseUp, false); } + } class Morph extends Physijs.SphereMesh { + static levels:number[] = [4, 6, 12, 20]; + - constructor(public faces:number, material?:THREE.Material, mass?:number) { - super(Morph.generateGeometry(faces), material, mass); + constructor(public level:number, material?:THREE.Material, mass?:number) { + super(Morph.generateGeometry(level), material, mass); } - static generateGeometry(numFaces:number):THREE.Geometry { - if (numFaces == 4) { - return new THREE.TetrahedronGeometry(); - } else if (numFaces == 6) { - return new THREE.BoxGeometry(1, 1, 1, 2, 2, 2); - } else if (numFaces == 12) { - return new THREE.DodecahedronGeometry(1, 0); - } else if (numFaces == 20) { - return new THREE.IcosahedronGeometry(1, 0); + static generateGeometry(level:number):THREE.Geometry { + let numFaces = Morph.levels[level]; + + switch (numFaces) { + case 4: + return new THREE.TetrahedronGeometry(); + case 6: + return new THREE.BoxGeometry(1, 1, 1, 1, 1, 1); + case 12: + return new THREE.DodecahedronGeometry(1, 0); + case 20: + return new THREE.IcosahedronGeometry(1, 0); + default: + return new THREE.TetrahedronGeometry(); } - return null; } - private updateGeometry(numFaces:number) { - this.faces = numFaces; - this.geometry = Morph.generateGeometry(this.faces); + private updateGeometry() { + this.geometry = Morph.generateGeometry(this.level); } - shrink(numFaces:number):void { - this.updateGeometry(this.faces - numFaces); + shrink():void { + if (this.level > 1) { + this.level--; + this.updateGeometry(); + } } - grow(numFaces:number):void { - this.updateGeometry(this.faces + numFaces); + grow():void { + if (this.level < 3) { + this.level++; + this.updateGeometry(); + } } } @@ -221,12 +255,12 @@ class Morph extends Physijs.SphereMesh { class Enemy extends Morph { constructor() { - super(6, Physijs.createMaterial( + super(0, Physijs.createMaterial( new THREE.MeshBasicMaterial({ color: 0xb02000 }), .8, - .3 + .6 ), 2); } @@ -244,20 +278,27 @@ class Enemy extends Morph { } class Player extends Morph { + minus:number; + plus:number; + life:number; + direction:Vector3 = new Vector3(0, 0, -1); + upward:Vector3 = new Vector3(0, 1, 0); + camera:Vector3 = new Vector3(0, 10, 10); + speed:number = 15; constructor() { - super(20, Physijs.createMaterial( + super(1, Physijs.createMaterial( new THREE.MeshBasicMaterial({ color: 0x00a0b0 }), .8, - .3 - ), 1); + .6 + ), 0.5); } jump() { - this.applyCentralImpulse(new Vector3(0, 20, 0)); + this.applyCentralImpulse(new Vector3(0, 8, 0)); } /* @@ -305,11 +346,11 @@ class World { scene.add(light); - let groundGeometry = new THREE.BoxGeometry(100, 1 ,100); + let groundGeometry = new THREE.BoxGeometry(1000, 1, 1000); let groundMaterial = Physijs.createMaterial( - new THREE.MeshBasicMaterial({color: 0xeaeaea}), - .8, - .3 + new THREE.MeshBasicMaterial({color: 0xdadada}), + 1, + .6 ); let ground = new Physijs.BoxMesh(groundGeometry, groundMaterial, 0); @@ -333,6 +374,7 @@ class Game { camera:THREE.PerspectiveCamera; scene:Physijs.Scene; player:Player; + playerDirection: THREE.ArrowHelper; world:World; state:GameState; @@ -371,15 +413,19 @@ class Game { init():void { //init world this.scene = new Physijs.Scene; - this.scene.setGravity(new THREE.Vector3( 0, -10, 0 )); + this.scene.setGravity(new THREE.Vector3(0, -10, 0)); this.player = new Player(); this.world = new World(this.player, this.scene, this.camera); //init camera - this.camera.position.set(5, 5, 5); + this.camera.position.addVectors(this.player.position, this.player.camera); this.camera.lookAt(this.player.position); + + this.playerDirection = new THREE.ArrowHelper(this.player.direction.clone().normalize(), this.player.position, 5); + this.scene.add(this.playerDirection); + this.state = GameState.INITIALIZED; } @@ -407,26 +453,83 @@ class Game { //console.log("tick " + delta); this.ticks++; this.keyboard.update(); + + this.camera.position.addVectors(this.player.position, this.player.camera); + + + if (this.mouse.xMovement != 0) { + this.camera.lookAt(this.player.position); + this.player.direction.applyAxisAngle(this.player.upward, -this.mouse.xMovement / 180); + this.player.camera.applyAxisAngle(this.player.upward, -this.mouse.xMovement / 180); + this.playerDirection.setDirection(this.player.direction); + + /* //Please nobody look at this. I am dumb... + + //this.player.camera -> relative position of camera to player + //to get rotation, just negate and normalize + let dir = this.player.camera.clone().negate().normalize(); + let newCamera = this.player.camera.clone().applyAxisAngle(new Vector3(0, 1, 0), -this.mouse.xMovement / 180); + let up = this.camera.up.clone().add(this.player.camera).applyAxisAngle(this.player.upward, -this.mouse.xMovement / 180).sub(newCamera); + let quatr = new THREE.Quaternion().setFromUnitVectors(new Vector3(0, 0, -1), dir); + //this.camera.rotateY(this.mouse.xMovement / 180); + //this.camera.up.copy(new Vector3(0,1,0)); + //this.camera.rotation.setFromQuaternion(quatr); + + this.player.direction.applyAxisAngle(new Vector3(0, 1, 0), this.mouse.xMovement / 180); + this.player.camera.copy(newCamera); + this.camera.lookAt(this.player.position); + console.log("A " + this.camera.up.toArray().toString() + " || " + this.camera.rotation.toArray().toString()); + //this.camera.up.copy(new Vector3(0,1,0)); + + console.log("B " + this.camera.up.toArray().toString() + " || " + this.camera.rotation.toArray().toString()); + + //this.camera.up.copy(up); + //this.camera.rotation.setFromQuaternion(quatr); + + let look = this.player.camera.clone().negate().normalize(); + let right = this.player.direction.clone().cross(this.player.upward).normalize(); + let angle = this.player.camera.angleTo(this.player.direction); + let camUp = this.player.upward.clone().applyAxisAngle(right, -angle); + + this.camera.rotation.copy( + new THREE.Euler().setFromVector3(look)); + this.camera.up.copy(camUp); + //rotate tis.player.upward around + this.camera.lookAt(this.player.position); + console.log(this.camera.rotation); + console.log(this.camera.quaternion); + //this.camera.rotationAutoUpdate = true; + this.camera.quaternion.setFromUnitVectors(new Vector3(0,0,-1), look); + this.camera.up.copy(this.player.upward); + */ + } + + let forward = this.player.direction.clone(); + forward.setLength(this.player.speed); + let right = this.player.direction.clone().cross(this.player.upward); + right.setLength(this.player.speed); + if (this.keyboard.pressed("W")) { - this.player.applyCentralForce(new Vector3(0, 0, -10)); + this.player.applyCentralForce(forward); } if (this.keyboard.pressed("S")) { - this.player.applyCentralForce(new Vector3(0, 0, 10)); - } - if (this.keyboard.pressed("A")) { - this.player.applyCentralForce(new Vector3(-10, 0, 0)); + this.player.applyCentralForce(forward.negate()); } if (this.keyboard.pressed("D")) { - this.player.applyCentralForce(new Vector3(10, 0, 0)); + this.player.applyCentralForce(right); } - if(this.keyboard.down("space")){ + if (this.keyboard.pressed("A")) { + this.player.applyCentralForce(right.negate()); + } + + if (this.keyboard.down("space")) { console.log("jump"); this.player.jump(); } - //this.camera.lookAt(this.player.position); - this.camera.position.addVectors(this.player.position, new Vector3(5,5,5)); - this.scene.simulate(undefined, 20); + +// console.log(this.camera.position.addVectors(this.player.position, this.player.camera)); + this.scene.simulate(undefined, 2); } run(timestamp?):void { diff --git a/index.html b/index.html index fe890c6..6d9e800 100644 --- a/index.html +++ b/index.html @@ -5,8 +5,8 @@ Transmuto + - -- cgit v1.2.3-70-g09d2