summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--index.css67
-rw-r--r--index.html8
-rw-r--r--omni.js557
-rw-r--r--omni.js.map2
-rw-r--r--src/block.ts181
-rw-r--r--src/cube.ts36
-rw-r--r--src/game.ts175
-rw-r--r--src/input.ts9
-rw-r--r--src/omni.ts158
-rw-r--r--src/pointerlock.ts75
10 files changed, 815 insertions, 453 deletions
diff --git a/index.css b/index.css
index 09e7b55..4e8a9ef 100644
--- a/index.css
+++ b/index.css
@@ -1,4 +1,69 @@
+html, body {
+ width: 100%;
+ height: 100%;
+}
+
body {
+ background-color: #ffffff;
+ margin: 0;
+ overflow: hidden;
+ font-family: arial, sans-serif;
+}
+
+#container {
+ position: absolute;
+
+ width: 100%;
+ height: 100%;
+
+ -webkit-user-select: none; /* Chrome/Safari */
+ -moz-user-select: none; /* Firefox */
+ -ms-user-select: none; /* IE10+ */
+}
+
+#block {
+ position: absolute;
+
+ width: 100%;
+ height: 100%;
+
+ background-color: rgba(0, 0, 0, 0.5);
+}
+
+#instructions {
width: 100%;
height: 100%;
-} \ No newline at end of file
+
+ display: -webkit-box;
+ display: -moz-box;
+ display: box;
+
+ -webkit-box-orient: horizontal;
+ -moz-box-orient: horizontal;
+ box-orient: horizontal;
+
+ -webkit-box-pack: center;
+ -moz-box-pack: center;
+ box-pack: center;
+
+ -webkit-box-align: center;
+ -moz-box-align: center;
+ box-align: center;
+
+ color: #ffffff;
+ text-align: center;
+
+ cursor: default;
+
+ text-shadow: 1px 3px 9px rgba(0, 0, 0, 0.4),
+ 3px 6px 8px rgba(0, 0, 0, 0.1),
+ -3px 6px 8px rgba(0, 0, 0, 0.1);
+
+}
+
+
+#heading {
+ font-size: xx-large;
+}
+
+
diff --git a/index.html b/index.html
index b798a7c..52ce294 100644
--- a/index.html
+++ b/index.html
@@ -9,7 +9,13 @@
<script type="text/javascript" src="js/physi.min.js"></script>
</head>
<body>
-<div id="container">T</div>
+<div id="container">
+ <div id="block">
+ <div id="instructions">
+ <span id="heading">Omniplex</span>
+ </div>
+ </div>
+</div>
<script type="text/javascript" src="omni.js"></script>
</body>
</html> \ No newline at end of file
diff --git a/omni.js b/omni.js
index 1c3c694..e5bb8e3 100644
--- a/omni.js
+++ b/omni.js
@@ -5,108 +5,172 @@ var __extends = (this && this.__extends) || function (d, b) {
};
var Omni;
(function (Omni) {
- var Cube = (function (_super) {
- __extends(Cube, _super);
- function Cube() {
- _super.call(this);
- var block = new Omni.LeverBlock();
- }
- Cube.prototype.tick = function (delta) {
- this.simulate(delta);
- };
- return Cube;
- }(Physijs.Scene));
- Omni.Cube = Cube;
-})(Omni || (Omni = {}));
-var Omni;
-(function (Omni) {
- var BlockLoader = (function () {
+ /**
+ * Base game class, will handle the game loop, rendering,
+ */
+ var Game = (function () {
/**
- * @param files what files to load()
+ *
*/
- function BlockLoader(files) {
+ function Game() {
var _this = this;
- this.files = files;
- this.manager = new THREE.LoadingManager();
- this.loader = new THREE.JSONLoader(this.manager);
- this.geometries = {};
- this.materials = {};
- this.loaded = false;
- this.manager.onLoad = function () {
- _this.loaded = true;
+ this.ticks = 0;
+ this.delta = 0;
+ this.lastFrame = 0;
+ this.timestep = 1000 / 60;
+ this.maxFPS = 60;
+ /**
+ *
+ */
+ this.start = function () {
+ console.debug("Game: start");
+ //wait around till block_loader is done loading assets
+ if (!_this.blockLoader.isLoaded()) {
+ setTimeout(_this.start, 10);
+ return;
+ }
+ //build the level here
+ _this.cube.init(0);
+ _this.unpause();
};
+ /**
+ * When leaving the page.
+ */
+ this.stop = function () {
+ _this.pause();
+ console.debug("Game: stop");
+ _this.blockLoader.dispose();
+ _this.renderer.dispose();
+ };
+ this.onWindowResize = function () {
+ _this.camera.aspect = window.innerWidth / window.innerHeight;
+ _this.camera.updateProjectionMatrix();
+ _this.renderer.setSize(window.innerWidth, window.innerHeight);
+ };
+ this.onVisibilityChange = function () {
+ console.debug("visibility change");
+ };
+ this.renderer = new THREE.WebGLRenderer({
+ antialias: true
+ });
+ this.renderer.setClearColor(0xbababa);
+ this.renderer.setSize(window.innerWidth, window.innerHeight);
+ document.body.appendChild(this.renderer.domElement);
+ window.addEventListener("resize", this.onWindowResize, false);
+ window.addEventListener("visibilitychange", this.onVisibilityChange, false);
+ this.camera = new THREE.PerspectiveCamera(Game.CAMERA_FOV, window.innerWidth / window.innerHeight, Game.CAMERA_NEAR, Game.CAMERA_FAR);
+ this.blockLoader = new Omni.BlockLoader(Omni.BlockLoader.BLOCKS);
}
/**
- * Load all the geometries and materials from mesh_files
+ *
*/
- BlockLoader.prototype.load = function () {
- var _this = this;
- console.log("BlockLoader: loading...");
- this.files.forEach(function (file) {
- _this.loadOne(file);
- });
+ Game.prototype.init = function () {
+ console.debug("Game: init");
+ this.blockLoader.load();
};
/**
- * Load additional geometries and mats
- * @param file what file to load. Will be prefixed with URL_PREFIX
+ *
*/
- BlockLoader.prototype.loadFile = function (file) {
- if (this.files.indexOf(file) == -1) {
- this.files.push(file);
- this.loadOne(file);
- }
+ Game.prototype.unpause = function () {
+ console.debug("Game: unpause");
+ this.keepRunning = true;
+ this.run();
};
- BlockLoader.prototype.loadOne = function (file) {
- var _this = this;
- this.loader.load(BlockLoader.URL_PREFIX + file, function (geometry, materials) {
- _this.geometries[file] = geometry;
- _this.materials[file] = materials;
- });
+ /**
+ *
+ * @param delta
+ */
+ Game.prototype.tick = function (delta) {
+ this.ticks++;
+ this.cube.tick(delta);
};
/**
- * Dispose of all the geometries and mats
+ *
*/
- BlockLoader.prototype.dispose = function () {
+ Game.prototype.render = function () {
+ this.renderer.render(this.cube, this.camera);
+ };
+ /**
+ *
+ * @param timestamp
+ */
+ Game.prototype.run = function (timestamp) {
var _this = this;
- console.log("BlockLoader: disposing...");
- if (this.loaded) {
- this.files.forEach(function (file) {
- _this.geometries[file].dispose();
- _this.materials[file].forEach(function (material) {
- material.dispose();
- });
- });
- this.loaded = false;
+ 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 (time) { return _this.run(time); });
}
};
- BlockLoader.prototype.isLoaded = function () {
- return this.loaded;
- };
- BlockLoader.prototype.meshLoaded = function (file) {
- return this.geometries[file] !== undefined;
- };
- BlockLoader.prototype.matsLoaded = function (file) {
- return this.materials[file] !== undefined;
- };
- BlockLoader.prototype.getMesh = function (file) {
- return this.geometries[file];
- };
- BlockLoader.prototype.getMaterials = function (file) {
- return this.materials[file];
+ /**
+ * When releasing pointer lock/on menu. Menu is HTML based.
+ */
+ Game.prototype.pause = function () {
+ console.debug("Game: pause");
+ this.keepRunning = false;
};
- BlockLoader.URL_PREFIX = "json/";
- BlockLoader.FILES = [
- PlainBlock.mesh_file,
- LeverBlock.mesh_file,
- ButtonBlock.mesh_file,
- AzimuthBlock.mesh_file,
- PullBlock.mesh_file];
- return BlockLoader;
+ Game.CAMERA_FOV = 55;
+ Game.CAMERA_NEAR = 1;
+ Game.CAMERA_FAR = 1000;
+ return Game;
}());
- Omni.BlockLoader = BlockLoader;
+ Omni.Game = Game;
+})(Omni || (Omni = {}));
+var game;
+var locker;
+window.onload = function () {
+ game = new Omni.Game();
+ locker = new Omni.PointerLocker(game.start, game.stop);
+ game.init();
+ locker.enable();
+};
+window.onunload = function () {
+ locker.disable();
+ game.stop();
+};
+var Omni;
+(function (Omni) {
+ var Keyboard = (function () {
+ function Keyboard() {
+ }
+ return Keyboard;
+ }());
+ Omni.Keyboard = Keyboard;
+ var Mouse = (function () {
+ function Mouse() {
+ }
+ return Mouse;
+ }());
+ Omni.Mouse = Mouse;
+})(Omni || (Omni = {}));
+var Omni;
+(function (Omni) {
var Block = (function () {
//will take the correct state as params?
- function Block() {
+ function Block(geometry, materials) {
+ this.geometry = geometry;
+ this.materials = materials;
+ this.mesh = new Physijs.BoxMesh(geometry, materials[0], 0);
}
Block.prototype.getState = function () {
return this.state;
@@ -114,6 +178,15 @@ var Omni;
Block.prototype.setState = function (state) {
this.state = state;
};
+ Block.prototype.setPosition = function (pos) {
+ this.mesh.position.copy(pos);
+ };
+ Block.prototype.getPosition = function () {
+ return this.mesh.position.clone();
+ };
+ Block.prototype.getObject = function () {
+ return this.mesh;
+ };
Block.mesh_file = "";
return Block;
}());
@@ -123,8 +196,8 @@ var Omni;
*/
var PlainBlock = (function (_super) {
__extends(PlainBlock, _super);
- function PlainBlock() {
- _super.call(this);
+ function PlainBlock(loader) {
+ _super.call(this, loader.getMesh(PlainBlock.mesh_file), loader.getMaterials(PlainBlock.mesh_file));
}
PlainBlock.mesh_file = "plainBlock.json";
PlainBlock.states = [];
@@ -136,8 +209,8 @@ var Omni;
*/
var ButtonBlock = (function (_super) {
__extends(ButtonBlock, _super);
- function ButtonBlock() {
- _super.call(this);
+ function ButtonBlock(loader) {
+ _super.call(this, loader.getMesh(ButtonBlock.mesh_file), loader.getMaterials(ButtonBlock.mesh_file));
}
//need to make good design choices here, with the handling of states..
ButtonBlock.mesh_file = "buttonBlock.json";
@@ -150,8 +223,8 @@ var Omni;
*/
var LeverBlock = (function (_super) {
__extends(LeverBlock, _super);
- function LeverBlock() {
- _super.call(this);
+ function LeverBlock(loader) {
+ _super.call(this, loader.getMesh(LeverBlock.mesh_file), loader.getMaterials(LeverBlock.mesh_file));
}
LeverBlock.mesh_file = "leverBlock.json";
LeverBlock.states = [0, 1, 2, 3];
@@ -184,6 +257,89 @@ var Omni;
return PullBlock;
}(Block));
Omni.PullBlock = PullBlock;
+ var BlockLoader = (function () {
+ /**
+ * @param files what files to load()
+ */
+ function BlockLoader(files) {
+ var _this = this;
+ this.files = files;
+ this.manager = new THREE.LoadingManager();
+ this.loader = new THREE.JSONLoader(this.manager);
+ this.geometries = {};
+ this.materials = {};
+ this.loaded = false;
+ this.manager.onLoad = function () {
+ _this.loaded = true;
+ console.debug("BlockLoader: loaded");
+ };
+ }
+ /**
+ * Load all the geometries and materials from mesh_files
+ */
+ BlockLoader.prototype.load = function () {
+ var _this = this;
+ console.debug("BlockLoader: loading...");
+ this.files.forEach(function (file) {
+ _this.loadOne(file);
+ });
+ };
+ /**
+ * Load additional geometries and mats
+ * @param file what file to load. Will be prefixed with URL_PREFIX
+ */
+ BlockLoader.prototype.loadFile = function (file) {
+ if (this.files.indexOf(file) == -1) {
+ this.files.push(file);
+ this.loadOne(file);
+ }
+ };
+ BlockLoader.prototype.loadOne = function (file) {
+ var _this = this;
+ this.loader.load(BlockLoader.URL_PREFIX + file, function (geometry, materials) {
+ _this.geometries[file] = geometry;
+ _this.materials[file] = materials;
+ });
+ };
+ /**
+ * Dispose of all the geometries and mats
+ */
+ BlockLoader.prototype.dispose = function () {
+ var _this = this;
+ console.debug("BlockLoader: disposing...");
+ if (this.loaded) {
+ this.files.forEach(function (file) {
+ _this.geometries[file].dispose();
+ _this.materials[file].forEach(function (material) {
+ material.dispose();
+ });
+ });
+ this.loaded = false;
+ }
+ };
+ BlockLoader.prototype.isLoaded = function () {
+ return this.loaded;
+ };
+ BlockLoader.prototype.meshLoaded = function (file) {
+ return this.geometries[file] !== undefined;
+ };
+ BlockLoader.prototype.matsLoaded = function (file) {
+ return this.materials[file] !== undefined;
+ };
+ BlockLoader.prototype.getMesh = function (file) {
+ return this.geometries[file];
+ };
+ BlockLoader.prototype.getMaterials = function (file) {
+ return this.materials[file];
+ };
+ BlockLoader.URL_PREFIX = "json/";
+ BlockLoader.BLOCKS = [
+ PlainBlock.mesh_file,
+ LeverBlock.mesh_file,
+ ];
+ return BlockLoader;
+ }());
+ Omni.BlockLoader = BlockLoader;
})(Omni || (Omni = {}));
var Omni;
(function (Omni) {
@@ -208,141 +364,122 @@ var Omni;
})(Omni || (Omni = {}));
var Omni;
(function (Omni) {
- var PointerLocker = (function () {
- function PointerLocker() {
+ var Cube = (function (_super) {
+ __extends(Cube, _super);
+ function Cube(loader) {
+ _super.call(this);
+ this.loader = loader;
}
- return PointerLocker;
- }());
- Omni.PointerLocker = PointerLocker;
+ Cube.prototype.init = function (level) {
+ //cube size, 4*4*4
+ //generate corners first
+ var half = Cube.SIZE / 2;
+ var corners = [
+ new THREE.Vector3(-1, -1, -1),
+ new THREE.Vector3(1, -1, -1),
+ new THREE.Vector3(-1, -1, 1),
+ new THREE.Vector3(1, -1, 1),
+ new THREE.Vector3(-1, 1, -1),
+ new THREE.Vector3(1, 1, -1),
+ new THREE.Vector3(-1, 1, 1),
+ new THREE.Vector3(1, 1, 1)
+ ];
+ for (var _i = 0, corners_1 = corners; _i < corners_1.length; _i++) {
+ var corner = corners_1[_i];
+ var vertex = corner.clone().multiplyScalar(half);
+ var block = new Omni.PlainBlock(this.loader);
+ block.setPosition(vertex.add(corner.clone().multiplyScalar(0.5)));
+ this.add(block.getObject());
+ this.blocks.push(block);
+ }
+ //then edges
+ //then fill in the rest
+ };
+ Cube.prototype.tick = function (delta) {
+ this.simulate(delta);
+ };
+ Cube.SIZE = 4;
+ return Cube;
+ }(Physijs.Scene));
+ Omni.Cube = Cube;
})(Omni || (Omni = {}));
-/// <reference path="../ts/three.d.ts" />
-/// <reference path="../ts/physijs.d.ts" />
-/// <reference path="cube.ts" />
-/// <reference path="block.ts" />
-/// <reference path="puzzle.ts" />
-/// <reference path="pointerlock.ts" />
-/// <reference path="interface.ts" />
var Omni;
(function (Omni) {
- /**
- * Base game class, will handle the game loop, rendering,
- */
- var Game = (function () {
- /**
- *
- */
- function Game() {
+ var PointerLocker = (function () {
+ function PointerLocker(onGain, onLose) {
var _this = this;
- this.ticks = 0;
- this.delta = 0;
- this.lastFrame = 0;
- this.timestep = 1000 / 60;
- this.maxFPS = 60;
- this.onWindowResize = function () {
- _this.camera.aspect = window.innerWidth / window.innerHeight;
- _this.camera.updateProjectionMatrix();
- _this.renderer.setSize(window.innerWidth, window.innerHeight);
+ this.onGain = onGain;
+ this.onLose = onLose;
+ this.hasLock = false;
+ this.blocker = document.getElementById("block");
+ this.instructions = document.getElementById("instructions");
+ this.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.hide();
+ _this.onGain();
+ }
+ else {
+ //lost
+ _this.hasLock = false;
+ _this.show();
+ _this.onLose();
+ }
+ };
+ this.onError = function (event) {
+ };
+ this.onClick = function (event) {
+ var element = document.body;
+ element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
+ _this.instructions.style.display = "none";
+ element.requestPointerLock();
};
- this.renderer = new THREE.WebGLRenderer({
- antialias: true
- });
- this.renderer.setClearColor(0xcacaca);
- this.renderer.setSize(window.innerWidth, window.innerHeight);
- document.body.appendChild(this.renderer.domElement);
- window.addEventListener("resize", this.onWindowResize, false);
- this.camera = new THREE.PerspectiveCamera(Game.CAMERA_FOV, window.innerWidth / window.innerHeight, Game.CAMERA_NEAR, Game.CAMERA_FAR);
- this.block_loader = new Omni.BlockLoader(Omni.BlockLoader.FILES);
}
- /**
- *
- */
- Game.prototype.init = function () {
- this.block_loader.load();
- };
- /**
- *
- */
- Game.prototype.start = function () {
- };
- /**
- *
- */
- Game.prototype.unpause = function () {
- };
- /**
- *
- * @param delta
- */
- Game.prototype.tick = function (delta) {
- this.ticks++;
- this.current_cube.tick(delta);
- };
- /**
- *
- */
- Game.prototype.render = function () {
- this.renderer.render(this.current_cube, this.camera);
- };
- /**
- *
- * @param timestamp
- */
- 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(); });
- }
+ PointerLocker.prototype.enable = function () {
+ var havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElsement' in document || 'webkitPointerLockElement' in document;
+ if (!havePointerLock) {
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 (time) { return _this.run(time); });
- }
+ document.addEventListener("pointerlockchange", this.onChange, false);
+ document.addEventListener("mozpointerlockchange", this.onChange, false);
+ document.addEventListener("webkitpointerlockchange", this.onChange, false);
+ document.addEventListener("pointerlockerror", this.onError, false);
+ document.addEventListener("mozpointerlockerror", this.onError, false);
+ document.addEventListener("webkitpointerlockerror", this.onError, false);
+ this.blocker.addEventListener("click", this.onClick, false);
};
- /**
- * When releasing pointer lock/on menu. Menu is HTML based.
- */
- Game.prototype.pause = function () {
+ PointerLocker.prototype.disable = function () {
+ document.removeEventListener("pointerlockchange", this.onChange, false);
+ document.removeEventListener("mozpointerlockchange", this.onChange, false);
+ document.removeEventListener("webkitpointerlockchange", this.onChange, false);
+ document.removeEventListener("pointerlockerror", this.onError, false);
+ document.removeEventListener("mozpointerlockerror", this.onError, false);
+ document.removeEventListener("webkitpointerlockerror", this.onError, false);
+ this.blocker.removeEventListener("click", this.onClick, false);
};
- /**
- * When leaving the page.
- */
- Game.prototype.stop = function () {
- this.block_loader.dispose();
+ PointerLocker.prototype.hide = function () {
+ this.blocker.style.display = "none";
};
- Game.CAMERA_FOV = 55;
- Game.CAMERA_NEAR = 1;
- Game.CAMERA_FAR = 1000;
- return Game;
+ PointerLocker.prototype.show = function () {
+ this.blocker.style.display = '-webkit-box';
+ this.blocker.style.display = '-moz-box';
+ this.blocker.style.display = 'box';
+ this.instructions.style.display = "";
+ };
+ return PointerLocker;
}());
- Omni.Game = Game;
+ Omni.PointerLocker = PointerLocker;
})(Omni || (Omni = {}));
-var game;
-window.onload = function () {
- console.log("onload");
- game = new Omni.Game();
- game.init();
- game.start();
-};
-window.onunload = function () {
- console.log("onunload");
- game.pause();
- game.stop();
-};
+/// <reference path="../ts/three.d.ts" />
+/// <reference path="../ts/physijs.d.ts" />
+/// <reference path="game.ts" />
+/// <reference path="interface.ts" />
+/// <reference path="input.ts" />
+/// <reference path="block.ts" />
+/// <reference path="puzzle.ts" />
+/// <reference path="cube.ts" />
+/// <reference path="pointerlock.ts" />
//# sourceMappingURL=omni.js.map \ No newline at end of file
diff --git a/omni.js.map b/omni.js.map
index e6cdf57..44699f4 100644
--- a/omni.js.map
+++ b/omni.js.map
@@ -1 +1 @@
-{"version":3,"file":"omni.js","sourceRoot":"","sources":["src/cube.ts","src/block.ts","src/puzzle.ts","src/pointerlock.ts","src/interface.ts","src/omni.ts"],"names":[],"mappings":"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"} \ No newline at end of file
+{"version":3,"file":"omni.js","sourceRoot":"","sources":["src/game.ts","src/interface.ts","src/input.ts","src/block.ts","src/puzzle.ts","src/cube.ts","src/pointerlock.ts","src/omni.ts"],"names":[],"mappings":"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"} \ No newline at end of file
diff --git a/src/block.ts b/src/block.ts
index bd80239..0d5b97e 100644
--- a/src/block.ts
+++ b/src/block.ts
@@ -1,5 +1,95 @@
module Omni {
+ export class Block {
+ private state:number;
+
+ private mesh:Physijs.BoxMesh;
+
+ static states:number[];
+ static mesh_file:string = "";
+
+ //will take the correct state as params?
+ constructor(private geometry:THREE.Geometry, private materials:THREE.Material[]) {
+ this.mesh = new Physijs.BoxMesh(geometry, materials[0], 0);
+ }
+
+ getState():number {
+ return this.state;
+ }
+
+ setState(state:number):void {
+ this.state = state;
+ }
+
+ setPosition(pos:THREE.Vector3):void {
+ this.mesh.position.copy(pos);
+ }
+
+ getPosition():THREE.Vector3 {
+ return this.mesh.position.clone();
+ }
+
+ getObject():THREE.Object3D {
+ return this.mesh;
+ }
+
+ }
+
+ /**
+ * Plain block without any puzzles.
+ */
+ export class PlainBlock extends Block {
+ static mesh_file = "plainBlock.json";
+ static states:number[] = [];
+
+ constructor(loader:BlockLoader) {
+ super(loader.getMesh(PlainBlock.mesh_file), loader.getMaterials(PlainBlock.mesh_file));
+ }
+ }
+
+ /**
+ * Button block with 2 states
+ */
+ export class ButtonBlock extends Block {
+ //need to make good design choices here, with the handling of states..
+ static mesh_file = "buttonBlock.json";
+ static states:number[] = [0, 1];
+
+ constructor(loader:BlockLoader) {
+ super(loader.getMesh(ButtonBlock.mesh_file), loader.getMaterials(ButtonBlock.mesh_file));
+ }
+ }
+
+ /**
+ * Lever block with 4 positions/states
+ */
+ export class LeverBlock extends Block {
+ static mesh_file = "leverBlock.json";
+ static states:number[] = [0, 1, 2, 3];
+
+ constructor(loader:BlockLoader) {
+ super(loader.getMesh(LeverBlock.mesh_file), loader.getMaterials(LeverBlock.mesh_file));
+ }
+ }
+
+ /**
+ *
+ */
+ export class AzimuthBlock extends Block {
+ static mesh_file = "azimuthBlock.json";
+ static states:number[] = [0, 1, 2, 3];
+
+ }
+
+ /**
+ *
+ */
+ export class PullBlock extends Block {
+ static mesh_file = "pullBlock.json";
+ static states:number[] = [];
+
+ }
+
export class BlockLoader {
private manager:THREE.LoadingManager = new THREE.LoadingManager();
private loader:THREE.JSONLoader = new THREE.JSONLoader(this.manager);
@@ -10,12 +100,13 @@ module Omni {
private loaded:boolean = false;
static URL_PREFIX:string = "json/";
- static FILES:string[] = [
+ static BLOCKS:string[] = [
PlainBlock.mesh_file,
LeverBlock.mesh_file,
- ButtonBlock.mesh_file,
- AzimuthBlock.mesh_file,
- PullBlock.mesh_file];
+ //ButtonBlock.mesh_file,
+ //AzimuthBlock.mesh_file,
+ //PullBlock.mesh_file,
+ ];
/**
* @param files what files to load()
@@ -23,6 +114,7 @@ module Omni {
constructor(private files:string[]) {
this.manager.onLoad = () => {
this.loaded = true;
+ console.debug("BlockLoader: loaded");
};
}
@@ -30,7 +122,7 @@ module Omni {
* Load all the geometries and materials from mesh_files
*/
load():void {
- console.log("BlockLoader: loading...");
+ console.debug("BlockLoader: loading...");
this.files.forEach((file) => {
this.loadOne(file);
});
@@ -58,7 +150,7 @@ module Omni {
* Dispose of all the geometries and mats
*/
dispose():void {
- console.log("BlockLoader: disposing...");
+ console.debug("BlockLoader: disposing...");
if (this.loaded) {
this.files.forEach((file) => {
this.geometries[file].dispose();
@@ -90,81 +182,4 @@ module Omni {
return this.materials[file];
}
}
-
- export class Block {
- private state:number;
-
- private mesh:Physijs.BoxMesh;
-
- static states:number[];
- static mesh_file:string = "";
-
- //will take the correct state as params?
- constructor() {
-
- }
-
- getState():number {
- return this.state;
- }
-
- setState(state:number):void {
- this.state = state;
- }
- }
-
- /**
- * Plain block without any puzzles.
- */
- export class PlainBlock extends Block {
- static mesh_file = "plainBlock.json";
- static states:number[] = [];
-
- constructor() {
- super();
- }
- }
-
- /**
- * Button block with 2 states
- */
- export class ButtonBlock extends Block {
- //need to make good design choices here, with the handling of states..
- static mesh_file = "buttonBlock.json";
- static states:number[] = [0, 1];
-
- constructor() {
- super();
- }
- }
-
- /**
- * Lever block with 4 positions/states
- */
- export class LeverBlock extends Block {
- static mesh_file = "leverBlock.json";
- static states:number[] = [0, 1, 2, 3];
-
- constructor() {
- super();
- }
- }
-
- /**
- *
- */
- export class AzimuthBlock extends Block {
- static mesh_file = "azimuthBlock.json";
- static states:number[] = [0, 1, 2, 3];
-
- }
-
- /**
- *
- */
- export class PullBlock extends Block {
- static mesh_file = "pullBlock.json";
- static states:number[] = [];
-
- }
} \ No newline at end of file
diff --git a/src/cube.ts b/src/cube.ts
index bcb2988..f80f07e 100644
--- a/src/cube.ts
+++ b/src/cube.ts
@@ -1,15 +1,41 @@
module Omni {
- export class Cube extends Physijs.Scene implements Tickable{
- private elements:Block[];
+ export class Cube extends Physijs.Scene implements Tickable {
+ private blocks:Block[];
private puzzles:Puzzle[];
- constructor() {
+ static SIZE:number = 4;
+
+ constructor(private loader:BlockLoader) {
super();
- let block = new LeverBlock();
-
}
+ init(level?:number):void {
+ //cube size, 4*4*4
+ //generate corners first
+ let half = Cube.SIZE / 2;
+ let corners = [
+ new THREE.Vector3(-1, -1, -1),
+ new THREE.Vector3(1, -1, -1),
+ new THREE.Vector3(-1, -1, 1),
+ new THREE.Vector3(1, -1, 1),
+ new THREE.Vector3(-1, 1, -1),
+ new THREE.Vector3(1, 1, -1),
+ new THREE.Vector3(-1, 1, 1),
+ new THREE.Vector3(1, 1, 1)
+ ];
+ for (let corner of corners) {
+ let vertex = corner.clone().multiplyScalar(half);
+ let block = new PlainBlock(this.loader);
+ block.setPosition(vertex.add(corner.clone().multiplyScalar(0.5)));
+ this.add(block.getObject());
+ this.blocks.push(block);
+ }
+
+ //then edges
+ //then fill in the rest
+
+ }
tick(delta:number):void {
this.simulate(delta);
diff --git a/src/game.ts b/src/game.ts
new file mode 100644
index 0000000..09aea10
--- /dev/null
+++ b/src/game.ts
@@ -0,0 +1,175 @@
+module Omni {
+ /**
+ * Base game class, will handle the game loop, rendering,
+ */
+ export class Game implements Tickable {
+ private renderer:THREE.WebGLRenderer;
+ private camera:THREE.PerspectiveCamera;
+
+ private blockLoader:BlockLoader;
+ private cube:Cube;
+
+ private ticks:number = 0;
+ private delta:number = 0;
+ private lastFrame:number = 0;
+ private timestep:number = 1000 / 60;
+ private maxFPS:number = 60;
+
+ private keepRunning:boolean;
+
+ static CAMERA_FOV:number = 55;
+ static CAMERA_NEAR:number = 1;
+ static CAMERA_FAR:number = 1000;
+
+ /**
+ *
+ */
+ constructor() {
+ this.renderer = new THREE.WebGLRenderer({
+ antialias: true
+ });
+ this.renderer.setClearColor(0xbababa);
+ this.renderer.setSize(window.innerWidth, window.innerHeight);
+ document.body.appendChild(this.renderer.domElement);
+
+ window.addEventListener("resize", this.onWindowResize, false);
+ window.addEventListener("visibilitychange", this.onVisibilityChange, false);
+
+ this.camera = new THREE.PerspectiveCamera(Game.CAMERA_FOV, window.innerWidth / window.innerHeight, Game.CAMERA_NEAR, Game.CAMERA_FAR);
+ this.blockLoader = new BlockLoader(BlockLoader.BLOCKS);
+ }
+
+ /**
+ *
+ */
+ init():void {
+ console.debug("Game: init");
+ this.blockLoader.load();
+ }
+
+ /**
+ *
+ */
+ start = ():void => {
+ console.debug("Game: start");
+
+ //wait around till block_loader is done loading assets
+ if (!this.blockLoader.isLoaded()) {
+ setTimeout(this.start, 10);
+ return;
+ }
+
+ //build the level here
+ this.cube.init(0);
+
+ this.unpause();
+ };
+
+ /**
+ *
+ */
+ unpause():void {
+ console.debug("Game: unpause");
+
+ this.keepRunning = true;
+ this.run();
+ }
+
+ /**
+ *
+ * @param delta
+ */
+ tick(delta:number):void {
+ this.ticks++;
+ this.cube.tick(delta);
+ }
+
+ /**
+ *
+ */
+ render():void {
+ this.renderer.render(this.cube, this.camera);
+ }
+
+ /**
+ *
+ * @param timestamp
+ */
+ run(timestamp?:number):void {
+ if (!timestamp) {
+ timestamp = performance.now();
+ }
+
+ if (timestamp < this.lastFrame + (1000 / this.maxFPS)) {
+ if (this.keepRunning) {
+ requestAnimationFrame(() => 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((time) => this.run(time));
+ }
+ }
+
+ /**
+ * When releasing pointer lock/on menu. Menu is HTML based.
+ */
+ pause():void {
+ console.debug("Game: pause");
+ this.keepRunning = false;
+ }
+
+ /**
+ * When leaving the page.
+ */
+ stop = ():void => {
+ this.pause();
+
+ console.debug("Game: stop");
+ this.blockLoader.dispose();
+ this.renderer.dispose();
+ };
+
+ onWindowResize = () => {
+ this.camera.aspect = window.innerWidth / window.innerHeight;
+ this.camera.updateProjectionMatrix();
+
+ this.renderer.setSize(window.innerWidth, window.innerHeight);
+ };
+
+ onVisibilityChange = () => {
+ console.debug("visibility change");
+ };
+
+ }
+}
+
+let game:Omni.Game;
+let locker:Omni.PointerLocker;
+
+window.onload = () => {
+ game = new Omni.Game();
+ locker = new Omni.PointerLocker(game.start, game.stop);
+ game.init();
+ locker.enable();
+};
+
+window.onunload = () => {
+ locker.disable();
+ game.stop();
+}; \ No newline at end of file
diff --git a/src/input.ts b/src/input.ts
new file mode 100644
index 0000000..07154a0
--- /dev/null
+++ b/src/input.ts
@@ -0,0 +1,9 @@
+module Omni {
+ export class Keyboard {
+
+ }
+
+ export class Mouse {
+
+ }
+} \ No newline at end of file
diff --git a/src/omni.ts b/src/omni.ts
index 64a31a8..fcef3d9 100644
--- a/src/omni.ts
+++ b/src/omni.ts
@@ -1,156 +1,10 @@
/// <reference path="../ts/three.d.ts" />
/// <reference path="../ts/physijs.d.ts" />
-/// <reference path="cube.ts" />
+
+/// <reference path="game.ts" />
+/// <reference path="interface.ts" />
+/// <reference path="input.ts" />
/// <reference path="block.ts" />
/// <reference path="puzzle.ts" />
-/// <reference path="pointerlock.ts" />
-/// <reference path="interface.ts" />
-
-module Omni {
- /**
- * Base game class, will handle the game loop, rendering,
- */
- export class Game implements Tickable {
- private renderer:THREE.WebGLRenderer;
- private camera:THREE.PerspectiveCamera;
-
- private block_loader:BlockLoader;
- private current_cube:Cube;
-
- private ticks:number = 0;
- private delta:number = 0;
- private lastFrame:number = 0;
- private timestep:number = 1000 / 60;
- private maxFPS:number = 60;
-
- private keepRunning:boolean;
-
- static CAMERA_FOV:number = 55;
- static CAMERA_NEAR:number = 1;
- static CAMERA_FAR:number = 1000;
-
- /**
- *
- */
- constructor() {
- this.renderer = new THREE.WebGLRenderer({
- antialias: true
- });
- this.renderer.setClearColor(0xcacaca);
- this.renderer.setSize(window.innerWidth, window.innerHeight);
- document.body.appendChild(this.renderer.domElement);
- window.addEventListener("resize", this.onWindowResize, false);
-
- this.camera = new THREE.PerspectiveCamera(Game.CAMERA_FOV, window.innerWidth / window.innerHeight, Game.CAMERA_NEAR, Game.CAMERA_FAR);
- this.block_loader = new BlockLoader(BlockLoader.FILES);
- }
-
- /**
- *
- */
- init():void {
-
- this.block_loader.load();
- }
-
- /**
- *
- */
- start():void {
-
- }
-
- /**
- *
- */
- unpause():void {
-
- }
-
- /**
- *
- * @param delta
- */
- tick(delta:number):void {
- this.ticks++;
- this.current_cube.tick(delta);
- }
-
- /**
- *
- */
- render():void {
- this.renderer.render(this.current_cube, this.camera);
- }
-
- /**
- *
- * @param timestamp
- */
- run(timestamp?:number):void {
- if (!timestamp) {
- timestamp = performance.now();
- }
-
- if (timestamp < this.lastFrame + (1000 / this.maxFPS)) {
- if (this.keepRunning) {
- requestAnimationFrame(() => 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((time) => this.run(time));
- }
- }
-
- /**
- * When releasing pointer lock/on menu. Menu is HTML based.
- */
- pause():void {
-
- }
-
- /**
- * When leaving the page.
- */
- stop():void {
- this.block_loader.dispose();
- }
-
- onWindowResize = () => {
- this.camera.aspect = window.innerWidth / window.innerHeight;
- this.camera.updateProjectionMatrix();
-
- this.renderer.setSize(window.innerWidth, window.innerHeight);
- };
-
- }
-}
-
-let game:Omni.Game;
-window.onload = () => {
- console.log("onload");
- game = new Omni.Game();
- game.init();
- game.start();
-};
-
-window.onunload = () => {
- console.log("onunload");
- game.pause();
- game.stop();
-};
+/// <reference path="cube.ts" />
+/// <reference path="pointerlock.ts" /> \ No newline at end of file
diff --git a/src/pointerlock.ts b/src/pointerlock.ts
index d75ccda..7bd4dab 100644
--- a/src/pointerlock.ts
+++ b/src/pointerlock.ts
@@ -1,5 +1,80 @@
module Omni {
export class PointerLocker {
+ hasLock:boolean = false;
+ private blocker:HTMLElement = document.getElementById("block");
+ private instructions:HTMLElement = document.getElementById("instructions");
+ constructor(private onGain:() => void, private onLose:() => void) {
+ }
+
+ enable():void {
+ let havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElsement' in document || 'webkitPointerLockElement' in document;
+ if (!havePointerLock) {
+ return;
+ }
+
+ document.addEventListener("pointerlockchange", this.onChange, false);
+ document.addEventListener("mozpointerlockchange", this.onChange, false);
+ document.addEventListener("webkitpointerlockchange", this.onChange, false);
+
+ document.addEventListener("pointerlockerror", this.onError, false);
+ document.addEventListener("mozpointerlockerror", this.onError, false);
+ document.addEventListener("webkitpointerlockerror", this.onError, false);
+
+ this.blocker.addEventListener("click", this.onClick, false);
+ }
+
+ onChange = (event):void => {
+ let element = document.body;
+ let doc:any = document;
+
+ if (doc.pointerLockElement === element || doc.mozPointerLockElement === element || doc.webkitPointerLockElement === element) {
+ //gained
+ this.hasLock = true;
+ this.hide();
+ this.onGain();
+ } else {
+ //lost
+ this.hasLock = false;
+ this.show();
+ this.onLose();
+ }
+ };
+
+ onError = (event):void => {
+
+ };
+
+ onClick = (event):void => {
+ let element:any = document.body;
+ element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
+ this.instructions.style.display = "none";
+
+ element.requestPointerLock();
+ };
+
+ disable():void {
+ document.removeEventListener("pointerlockchange", this.onChange, false);
+ document.removeEventListener("mozpointerlockchange", this.onChange, false);
+ document.removeEventListener("webkitpointerlockchange", this.onChange, false);
+
+ document.removeEventListener("pointerlockerror", this.onError, false);
+ document.removeEventListener("mozpointerlockerror", this.onError, false);
+ document.removeEventListener("webkitpointerlockerror", this.onError, false);
+
+ this.blocker.removeEventListener("click", this.onClick, false);
+ }
+
+ private hide():void {
+ this.blocker.style.display = "none";
+ }
+
+ private show():void {
+ this.blocker.style.display = '-webkit-box';
+ this.blocker.style.display = '-moz-box';
+ this.blocker.style.display = 'box';
+
+ this.instructions.style.display = "";
+ }
}
} \ No newline at end of file