Spell-Mastery-Game-Prototype / Scripts / Manager / SceneManager.js
SceneManager.js
Raw
class SceneManager
{
  cameraTarget = null
  cameraPos = new Vector2()
  
  constructor()
  {
    this.activeScenes = new List()
    this.loadedScenes = new List()
  }
  
  openScene(sceneClass, once = false, forceOpen = true, mono = false)
  {
    let name = sceneClass.name
    let scene = null
    
    if(once)
    {
      let index = this.isSceneActive(name)
      
      if(index >= 0)
        return this.activeScenes.items[index]
    }
    
    scene = this.loadedScenes.items[this.isSceneLoaded(name)]
    
    if(scene == null && forceOpen)
      scene = this.instantiateScene(sceneClass)
    
    if(mono)
      this.deactivateAllScenes()
    
    this.activateScene(scene)
    return scene
  }
  
  activateScene(scene)
  {
    this.activeScenes.add(scene)
    scene.active = true
    scene.beforeActive()
  }
  
  deactivateAllScenes()
  {
    for(let i in this.activeScenes.items)
      this.activeScenes.items[i].active = false
  }
  
  activateAllScenes()
  {
    for(let i in this.activeScenes.items)
      this.activeScenes.items[i].active = true
  }
  
  instantiateScene(sceneClass)
  {
    let sceneInstance = new sceneClass()
    this.loadScene(sceneInstance)
    return sceneInstance
  }
  
  loadScene(scene)
  {
    scene.load()
    scene.loaded = true
    this.loadedScenes.add(scene)
  }
  
  removeScene(scene)
  {
    this.closeScene(scene)
    this.loadedScenes.remove(scene)
    scene.loaded = false
  }
  
  closeScene(scene)
  {
    if(scene == -1 || scene == null)
      return

    scene.onClose()
    this.activeScenes.remove(scene)
    scene.active = false
  }
  
  closeScenesWithName(name)
  {
    for(let s of this.getActiveScenesByClassName(name).items)
      this.closeScene(s)
  }
  
  isSceneLoaded(name)
  {
    for(let i in this.loadedScenes.items)
      if(this.loadedScenes.items[i].constructor.name == name)
        return i
    
    return -1
  }
  
  isSceneActive(name)
  {
    for(let i in this.activeScenes.items)
      if(this.activeScenes.items[i].constructor.name == name)
        return i
    
    return -1
  }
  
  collectActiveGameObjects()
  {
    this.calcCameraPos()
    
    for(let scene of this.activeScenes.items)
      scene.collectActiveGameObjects()
  }
  
  collectActiveGUIObjects()
  {
    this.calcCameraPos()
    
    for(let scene of this.activeScenes.items)
      scene.collectActiveGUIObjects()
  }
  
  calcCameraPos()
  {
    if (this.cameraTarget == null)
      return
    
    var dim = this.cameraTarget.getDimension()

    let canvas = _gameManager.canvasManager.canvas
    let nextPos = new Vector2(
      this.cameraTarget.pos.x - canvas.width / 2 + dim.x / 2,
      this.cameraTarget.pos.y - canvas.height / 2 + dim.y / 2
    )
    
    if(nextPos.x != null && nextPos.y != null)
      this.cameraPos.copyValues(nextPos)
  }
  
  getActiveScenesByClassName(className)
  {
    let scenesWithName = new List()
    
    for(let scene of this.activeScenes.items)
      if(scene.constructor.name == className)
        scenesWithName.add(scene)
    
    return scenesWithName
  }
  
  getLoadedScenesByClassName(className)
  {
    let scenesWithName = new List()
    
    for(let scene of this.loadedScenes.items)
      if(scene.constructor.name == className)
        scenesWithName.add(scene)
    
    return scenesWithName
  }
  
  worldToScreenPos(pos)
  {
    pos.subtract(this.cameraPos)
  }
}

console.log(SceneManager.name+' loaded...')