diff options
| -rw-r--r-- | index.css | 67 | ||||
| -rw-r--r-- | index.html | 8 | ||||
| -rw-r--r-- | omni.js | 557 | ||||
| -rw-r--r-- | omni.js.map | 2 | ||||
| -rw-r--r-- | src/block.ts | 181 | ||||
| -rw-r--r-- | src/cube.ts | 36 | ||||
| -rw-r--r-- | src/game.ts | 175 | ||||
| -rw-r--r-- | src/input.ts | 9 | ||||
| -rw-r--r-- | src/omni.ts | 158 | ||||
| -rw-r--r-- | src/pointerlock.ts | 75 |
10 files changed, 815 insertions, 453 deletions
@@ -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; +} + + @@ -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 @@ -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 |
