var GameManagerStatics = {DrawableUpdatePaused:false,instance:null};
class GameManager {
constructor()
{
GameManagerStatics.instance = this;
this.ready = false;
this.timeScale = 1;
this.gameFramesPerRealFrame = 1;
this.nextGameFramesPerRealFrame = null; //int?
this.forceFrameTime = null; //number?
this.onMainLoopException = new Action();
this.frameTime = 0;
}
init(jsRoot, gameClass)
{
this.gameClass = gameClass;
EngineSettings.AssetRoot = nw ? "shared/images/" : "images/";
EngineSettings.Pixi.ticker.add(delta => { this.lastFrameTime = performance.now(); this.update(delta); });
//Engine.GraphicFactoryInstance.addGraphicData(new Engine.GraphicDef("ForestTiles","images/ForestTiles.json"));
this.loadCount = 0;
this.expectedLoadCount = 0;
/*
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/championsUI.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/fusionUI.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/BW2BaseCustoms.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/Doodads.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/Doodads2.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhacker/AnimatedDoodads.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhacker/AnimatedDoodads2.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/tilePack.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/Pets.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/Pets2.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/Mounts.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/BushWhackerSheets/CustomItems.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/ShardsSheets/Doodads.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/ShardsSheets/AnimatedDoodads.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/ShardsSheets/Monsters.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/ShardsSheets/Tiles.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
//Engine.GraphicFactoryInstance.loadGraphicDataFromURL("images/ShardsSheets/CustomItems.json", () => { this.UILoaded(); }); this.expectedLoadCount++;
Engine.GraphicFactoryInstance.addGraphicData(new Engine.GraphicDef("Hero_Female","images/Character/Hero_Female.json"));
Engine.GraphicFactoryInstance.addGraphicData(new Engine.GraphicDef("Hero_Male","images/Character/Hero_Male.json"));
Engine.GraphicFactoryInstance.addGraphicData(new Engine.GraphicDef("Hero_Male_Full","images/ShardsSheets/Hero_Male_Full.json"));
Engine.GraphicFactoryInstance.addGraphicData(new Engine.GraphicDef("Hero_Female_Full","images/ShardsSheets/Hero_Female_Full.json"));
Engine.GraphicFactoryInstance.addGraphicData(new Engine.GraphicDef("GenericFlag","images/GenericFlag.json"));
*/
this.gameDrawable = new Engine.Drawable();
Engine.rootDrawable.addChild(this.gameDrawable);
let style = new PIXI.TextStyle({
fontFamily: "Verdana",
fontSize: 12,
fill: "white",
stroke: '#ff3300',
strokeThickness: 4,
dropShadow: true,
dropShadowColor: "#000000",
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6,
});
this.fps = new PIXI.Text("Hello Pixi!", style);
EngineSettings.Pixi.stage.addChild(this.fps);
this.lastFrameTime = performance.now();
this.gameTime = 0;
this.outOfFocusUpdateCheck();
var w = new Worker(jsRoot + "out_of_focus_update_worker.js");
w.onmessage = e =>
{
if (e.data == "outOfFocusUpdate")
{
this.outOfFocusUpdateCheck();
}
};
GameManager.adminTimeScale = 1;
if (this.expectedLoadCount == 0) this.UILoaded();
}
UILoaded()
{
if (++this.loadCount >= this.expectedLoadCount) this.game = Game.InitGame(Engine.rootDrawable, this.gameClass);
}
/*
update (dt)
{
dt = (dt / 60) * this.timeScale;
//For proper ordering do the frame events from the previous frame now.
Engine.Drawable.doQueuedFrameEvents();
Engine.EnterFrameManagerInstance.enterFrame(dt, dt);
Engine.rootDrawable.drawableUpdate(dt);
this.fps.text = "FPS:"+Math.round(Engine.Pixi.ticker.FPS);
Engine.EnterFrameManagerInstance.postFrame(dt, dt);
KeyboardManager.update(dt);
}*/
update (dt)
{
var realDT = dt / (60 * EngineSettings.Pixi.ticker.speed);
this.gameTime += realDT;
this.updateInner(realDT);
KeyboardManager.update(dt);
}
updateInner(realDT)
{
var hadMultiGameFrames = this.gameFramesPerRealFrame > 1;
var dt = realDT * this.timeScale * GameManager.adminTimeScale;
for (var i = 0; i < this.gameFramesPerRealFrame; i++)
{
if (this.forceFrameTime != null)
{
realDT = this.forceFrameTime;
dt = dt = realDT * this.timeScale * GameManager.adminTimeScale;
}
//For proper ordering do the frame events from the previous frame now.
Engine.Drawable.doQueuedFrameEvents();
Engine.EnterFrameManagerInstance.enterFrame(dt, realDT);
Engine.rootDrawable.drawableUpdate(dt, GameManagerStatics.DrawableUpdatePaused, i >= this.gameFramesPerRealFrame - 1);
this.fps.text = "FPS:"+Math.round(Engine.Pixi.ticker.FPS);
Engine.EnterFrameManagerInstance.postFrame(dt, realDT);
MultiFilterStatics.frameDone();
}
if (this.nextGameFramesPerRealFrame != null)
{
this.gameFramesPerRealFrame = this.nextGameFramesPerRealFrame;
this.nextGameFramesPerRealFrame = null;
}
}
inFocusUpdateCheck()
{
this.frameTime += (performance.now() - this.lastFrameTime);
this.lastFrameTime = performance.now();
if (this.frameTime > (1000 / 60) * (60 / GameSettings.targetFramerate)) // 16.67
{
var framesPassed = this.frameTime / (1000 / 60);
while (framesPassed > 0)
{
var use = Math.min(10, framesPassed);
framesPassed -= use;
this.update(use);
}
Debug.Log("In Focus Update!");
this.frameTime = 0;
}
}
outOfFocusUpdateCheck()
{
var timeSinceFrameUpdate = performance.now() - this.lastFrameTime;
if (timeSinceFrameUpdate > 500)
{
this.lastFrameTime = performance.now();
var framesPassed = (timeSinceFrameUpdate * 60) / 1000;
while (framesPassed > 0)
{
var use = Math.min(10, framesPassed);
framesPassed -= use;
this.update(use);
}
}
}
};