177 lines
3.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**************************************
GAME CLASS SINGLETON:
Handles the DOM, load, init, update & render loops
**************************************/
(function(exports){
// Singleton
var Game = {};
exports.Game = Game;
// PROPERTIES
Game.width = 960;
Game.height = 540;
Game.stats = true;
// INIT
Game.init = function(HACK){
// Set up PIXI
Game.renderer = new PIXI.WebGLRenderer(Game.width, Game.height);
document.querySelector("#stage").appendChild(Game.renderer.view);
Game.stage = new PIXI.Container();
Game.stage.interactive = true;
// Mr Doob Stats
if(Game.stats){
Game.stats = new Stats();
Game.stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild(Game.stats.dom);
}
// Scene Manager
Game.scene = null;
Game.sceneManager = new SceneManager();
if(HACK){
// NOT preloader - jump direct to a scene
Game.loadAssets(function(){ // well, also get preloader assets...
Game.loadAssets(function(){
Game.sceneManager.gotoScene(HACK);
setInterval(Game.update,1000/60);
Game.animate();
}, function(){}, false);
}, function(){}, true);
}else{
// Preloader
Game.loadAssets(function(){
Game.sceneManager.gotoScene("Preloader");
setInterval(Game.update,1000/60);
Game.animate();
}, function(){}, true);
}
};
// UPDATE & ANIMATE
Game.paused = false;
Game.update = function(){
if(Game.paused) return;
Tween.tick();
Game.sceneManager.update();
};
Game.animate = function(){
if(Game.stats) Game.stats.begin();
if(!Game.paused){
Game.renderer.render(Game.stage);
}
if(Game.stats) Game.stats.end();
requestAnimationFrame(Game.animate);
};
// GAME PAUSED?
// ON BLUR & PAUSE
var modal_shade = document.getElementById("modal_shade");
var paused = document.getElementById("paused");
window.onblur = function(){
if(Game.scene && Game.scene.UNPAUSEABLE) return;
modal_shade.style.display = "block";
paused.style.display = "block";
Game.paused = true;
Howler.mute(true);
}
modal_shade.onclick = paused.onclick = function(){
modal_shade.style.display = "none";
paused.style.display = "none";
Game.paused = false;
Howler.mute(false);
};
// LOADING, and ADDING TO MANIFEST.
// TO DO: Progress, too
Game.manifest = {};
Game.manifest2 = {}; // FOR PRELOADER
Game.sounds = {};
Game.loadAssets = function(completeCallback, progressCallback, PRELOADER){
var manifest = PRELOADER ? Game.manifest2 : Game.manifest;
// ABSOLUTE NUMBER OF ASSETS!
var _totalAssetsLoaded = 0;
var _totalAssetsToLoad = 0;
for(var key in manifest){
var src = manifest[key];
if(src.slice(-5)==".json"){
// Is Sprite. Actually TWO assets.
_totalAssetsToLoad += 2;
}else{
_totalAssetsToLoad += 1;
}
}
var _onAssetLoad = function(){
_totalAssetsLoaded++;
progressCallback(_totalAssetsLoaded/_totalAssetsToLoad); // PROGRESS.
};
// META: Groups To Load just images & sounds
var _groupsToLoad = PRELOADER ? 1 : 2;
var _onGroupLoaded = function(){
_groupsToLoad--;
if(_groupsToLoad==0) completeCallback(); // DONE.
};
// Howler
var _soundsToLoad = 0;
var _onSoundLoad = function(){
_soundsToLoad--;
_onAssetLoad();
if(_soundsToLoad==0) _onGroupLoaded();
};
// PIXI
var loader = PIXI.loader;
var resources = PIXI.loader.resources;
for(var key in manifest){
var src = manifest[key];
// Is MP3. Leave it to Howler.
if(src.slice(-4)==".mp3"){
var sound = new Howl({ src:[src] });
_soundsToLoad++;
sound.once('load', _onSoundLoad);
Game.sounds[key] = sound;
continue;
}
// Otherwise, is an image. Leave it to PIXI.
loader.add(key, src);
}
// PIXI
loader.on('progress',_onAssetLoad);
loader.once('complete', _onGroupLoaded);
loader.load();
};
// Add To Manifest
Game.addToManifest = function(keyValues, PRELOADER){
var manifest = PRELOADER ? Game.manifest2 : Game.manifest;
for(var key in keyValues){
manifest[key] = keyValues[key];
}
};
})(window);