summaryrefslogtreecommitdiff
path: root/game.js
diff options
context:
space:
mode:
Diffstat (limited to 'game.js')
-rw-r--r--game.js330
1 files changed, 330 insertions, 0 deletions
diff --git a/game.js b/game.js
new file mode 100644
index 0000000..595a347
--- /dev/null
+++ b/game.js
@@ -0,0 +1,330 @@
+/// <reference path="three_js/ts/three.d.ts"/>
+/// <reference path="physi_js/physijs.d.ts"/>
+/// <reference path="three_js/ts/detector.d.ts"/>
+var __extends = (this && this.__extends) || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+};
+var Vector3 = THREE.Vector3;
+var ShaderMaterial = THREE.ShaderMaterial;
+var Material = THREE.Material;
+var Geometry = THREE.Geometry;
+var PointerLock = (function () {
+ function PointerLock(game, blocker, instructions) {
+ this.game = game;
+ this.blocker = blocker;
+ this.instructions = instructions;
+ this.hasLock = false;
+ }
+ PointerLock.prototype.gain = function () {
+ var _this = this;
+ var havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElement' in document || 'webkitPointerLockElement' in document;
+ if (!havePointerLock) {
+ return;
+ }
+ document.addEventListener('pointerlockchange', function (event) { return _this.onChange(event); }, false);
+ document.addEventListener('mozpointerlockchange', function (event) { return _this.onChange(event); }, false);
+ document.addEventListener('webkitpointerlockchange', function (event) { return _this.onChange(event); }, false);
+ document.addEventListener('pointerlockerror', function (event) { return _this.onError(event); }, false);
+ document.addEventListener('mozpointerlockerror', function (event) { return _this.onError(event); }, false);
+ document.addEventListener('webkitpointerlockerror', function (event) { return _this.onError(event); }, false);
+ this.instructions.addEventListener("click", function (event) { return _this.onClick(event); }, false);
+ };
+ PointerLock.prototype.onChange = function (event) {
+ var element = document.body;
+ var doc = document;
+ if (doc.pointerLockElement === element || doc.mozPointerLockElement === element || doc.webkitPointerLockElement === element) {
+ //gained
+ this.hasLock = true;
+ this.blocker.style.display = "none";
+ if (this.game.state == GameState.INITIALIZED || this.game.state == GameState.PAUSED) {
+ this.game.start();
+ }
+ console.log("gained");
+ }
+ else {
+ //lost
+ this.hasLock = false;
+ this.blocker.style.display = '-webkit-box';
+ this.blocker.style.display = '-moz-box';
+ this.blocker.style.display = 'box';
+ this.instructions.style.display = "";
+ if (this.game.state == GameState.STARTED) {
+ this.game.pause();
+ }
+ console.log("lost");
+ }
+ };
+ PointerLock.prototype.onError = function (event) {
+ this.instructions.style.display = "";
+ };
+ PointerLock.prototype.onClick = function (event) {
+ var element = document.body;
+ element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
+ this.instructions.style.display = "none";
+ element.requestPointerLock();
+ };
+ return PointerLock;
+}());
+var Keyboard = (function () {
+ function Keyboard() {
+ this.status = {};
+ }
+ Keyboard.prototype.update = function () {
+ for (var key in this.status) {
+ // insure that every keypress has "down" status exactly once
+ if (!this.status[key].updatedPreviously) {
+ this.status[key].down = true;
+ this.status[key].pressed = true;
+ this.status[key].updatedPreviously = true;
+ }
+ else {
+ this.status[key].down = false;
+ }
+ // key has been flagged as "up" since last update
+ if (this.status[key].up) {
+ delete this.status[key];
+ continue; // move on to next key
+ }
+ if (!this.status[key].pressed)
+ 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);
+ };
+ Keyboard.prototype.pressed = function (key) {
+ return (this.status[key] && this.status[key].pressed);
+ };
+ Keyboard.prototype.up = function (key) {
+ 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);
+ };
+ Keyboard.keyName = function (keyCode) {
+ return (Keyboard.k[keyCode] != null) ?
+ Keyboard.k[keyCode] :
+ String.fromCharCode(keyCode);
+ };
+ Keyboard.k = {
+ 8: "backspace", 9: "tab", 13: "enter", 16: "shift",
+ 17: "ctrl", 18: "alt", 27: "esc", 32: "space",
+ 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
+ 37: "left", 38: "up", 39: "right", 40: "down",
+ 45: "insert", 46: "delete", 186: ";", 187: "=",
+ 188: ",", 189: "-", 190: ".", 191: "/",
+ 219: "[", 220: "\\", 221: "]", 222: "'"
+ };
+ return Keyboard;
+}());
+var Morph = (function (_super) {
+ __extends(Morph, _super);
+ function Morph(numFaces, material, mass) {
+ var geometry = Morph.generateGeometry(numFaces);
+ _super.call(this, geometry, material, mass);
+ }
+ Morph.generateGeometry = function (numFaces) {
+ 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);
+ }
+ return null;
+ };
+ Morph.prototype.updateGeometry = function (numFaces) {
+ this.faces = numFaces;
+ this.geometry = Morph.generateGeometry(this.faces);
+ };
+ Morph.prototype.shrink = function (numFaces) {
+ this.updateGeometry(this.faces - numFaces);
+ };
+ Morph.prototype.grow = function (numFaces) {
+ this.updateGeometry(this.faces + numFaces);
+ };
+ Morph.prototype.wobble = function () {
+ };
+ return Morph;
+}(Physijs.Mesh));
+var Enemy = (function (_super) {
+ __extends(Enemy, _super);
+ function Enemy() {
+ _super.call(this, 6, Enemy.getMaterial(), 2);
+ }
+ Enemy.getMaterial = function () {
+ return new THREE.MeshBasicMaterial({
+ color: 0xb02000
+ });
+ /*
+ return new THREE.ShaderMaterial({
+ uniforms:{},
+ fragmentShader: document.getElementById(Enemy.shader).textContent,
+ vertexShader: document.getElementById(World.vertex_shader).textContent,
+ });*/
+ };
+ return Enemy;
+}(Morph));
+var Player = (function (_super) {
+ __extends(Player, _super);
+ function Player() {
+ _super.call(this, 4, Player.getMaterial(), 1);
+ }
+ Player.getMaterial = function () {
+ return new THREE.MeshBasicMaterial({
+ color: 0x00a0b0
+ });
+ /*
+ return new THREE.ShaderMaterial({
+ uniforms:{},
+ fragmentShader: document.getElementById(Player.shader).textContent,
+ vertexShader: document.getElementById(World.vertex_shader).textContent,
+ });*/
+ };
+ return Player;
+}(Morph));
+var World = (function () {
+ function World(player, scene, camera) {
+ player.position.set(0, 0, 0);
+ scene.add(player);
+ var enemy = new Enemy();
+ enemy.position.set(0, 5, 0);
+ scene.add(enemy);
+ }
+ return World;
+}());
+var GameState;
+(function (GameState) {
+ GameState[GameState["INITIALIZED"] = 0] = "INITIALIZED";
+ GameState[GameState["STARTED"] = 1] = "STARTED";
+ GameState[GameState["PAUSED"] = 2] = "PAUSED";
+ GameState[GameState["STOPPED"] = 3] = "STOPPED";
+})(GameState || (GameState = {}));
+var Game = (function () {
+ function Game() {
+ var _this = this;
+ this.ticks = 0;
+ this.delta = 0;
+ this.lastFrame = 0;
+ this.timestep = 1000 / 30;
+ this.maxFPS = 30;
+ this.renderer = new THREE.WebGLRenderer({
+ antialias: true
+ });
+ this.renderer.setClearColor(0xffffff);
+ this.renderer.setPixelRatio(window.devicePixelRatio);
+ this.renderer.setSize(window.innerWidth, window.innerHeight);
+ document.body.appendChild(this.renderer.domElement);
+ window.addEventListener("resize", function () { return _this.onWindowResize(); }, false);
+ this.scene = new THREE.Scene();
+ this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 1, 1000);
+ this.keyboard = new Keyboard();
+ this.keyboard.register();
+ }
+ Game.prototype.init = function () {
+ //init world
+ this.player = new Player();
+ this.world = new World(this.player, this.scene, this.camera);
+ //init camera
+ this.camera.position.set(10, 10, 10);
+ this.camera.lookAt(this.player.position);
+ this.state = GameState.INITIALIZED;
+ };
+ Game.prototype.onWindowResize = function () {
+ this.camera.aspect = window.innerWidth / window.innerHeight;
+ this.camera.updateProjectionMatrix();
+ this.renderer.setSize(window.innerWidth, window.innerHeight);
+ };
+ /**
+ * Just render the scene.
+ */
+ Game.prototype.render = function () {
+ //console.log("render");
+ this.renderer.render(this.scene, this.camera);
+ };
+ /**
+ * Update logic based on @param delta.
+ * @param delta
+ */
+ Game.prototype.tick = function (delta) {
+ //console.log("tick " + delta);
+ this.ticks++;
+ this.keyboard.update();
+ };
+ Game.prototype.run = function (timestamp) {
+ var _this = this;
+ if (!timestamp) {
+ timestamp = performance.now();
+ }
+ if (timestamp < this.lastFrame + (1000 / this.maxFPS)) {
+ if (this.keepRunning) {
+ requestAnimationFrame(function () { return _this.run(); });
+ }
+ return;
+ }
+ this.delta += timestamp - this.lastFrame;
+ this.lastFrame = timestamp;
+ var numUpdateSteps = 0;
+ while (this.delta >= this.timestep) {
+ this.tick(this.timestep);
+ this.delta -= this.timestep;
+ if (++numUpdateSteps >= 240) {
+ // panic here, reset delta
+ this.delta = 0;
+ break;
+ }
+ }
+ this.render();
+ if (this.keepRunning) {
+ requestAnimationFrame(function () { return _this.run(); });
+ }
+ };
+ Game.prototype.start = function () {
+ this.state = GameState.STARTED;
+ this.keepRunning = true;
+ this.run();
+ };
+ Game.prototype.pause = function () {
+ this.state = GameState.PAUSED;
+ this.keepRunning = false;
+ };
+ Game.prototype.stop = function () {
+ this.pause();
+ this.state = GameState.STOPPED;
+ //end here!!
+ //todo
+ };
+ return Game;
+}());
+if (!Detector.webgl) {
+ Detector.addGetWebGLMessage();
+}
+window.onload = function () {
+ var game = new Game();
+ game.init();
+ //make sure we have pointerlock here
+ var block = document.getElementById("block");
+ var instructions = document.getElementById("instructions");
+ var plock = new PointerLock(game, block, instructions);
+ plock.gain();
+};
+//# sourceMappingURL=game.js.map \ No newline at end of file