mirror of
https://gitlab.com/skysthelimit.dev/selenite.git
synced 2025-06-16 02:22:07 -05:00
177 lines
3.8 KiB
JavaScript
177 lines
3.8 KiB
JavaScript
/**************************************
|
||
|
||
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); |