UNPKG

@prismadev/webmarine2d

Version:

Core utils for 2D verson of game engine Webmarine

92 lines 3.06 kB
import { SceneNotFoundError } from "../core/errors/SceneNotFoundError"; import { RendererObservable } from "../core/observer/RendererObservable"; /** Game engine renderer */ export class Renderer { /** Construct renderer */ constructor(config) { if (!config) config = {}; this.canvas = document.createElement('canvas'); this.ctx = this.canvas.getContext('2d'); this.events = new RendererObservable(); this.state = false; // Check adjust and size config parameters if (config.fullscreen) { this.canvas.style.position = 'fixed'; this.canvas.style.zIndex = '1000'; this.canvas.style.width = window.innerWidth.toString(); this.canvas.style.height = window.innerHeight.toString(); this.canvas.style.top = '0'; this.canvas.style.left = '0'; this.canvas.width = window.innerWidth; this.canvas.height = window.innerHeight; } else { if (config.size) { this.canvas.width = config.size.width; this.canvas.height = config.size.height; } else { if (this.canvas.parentElement) { this.canvas.width = this.canvas.parentElement.offsetWidth; this.canvas.height = this.canvas.parentElement.offsetHeight; } } } // Check antialias config parameter if (config.antialias) { this.ctx.imageSmoothingEnabled = true; } // Add canvas to the body document.body.append(this.canvas); } /** Get delta time */ get delta() { return this.isRunning ? this._delta : Infinity; } /** Renderer state getter */ get isRunning() { return this.state; } /** Events getter */ get event() { return this.events; } /** Scene getter */ get scene() { return this._scene; } /** Scene setter */ set scene(val) { this._scene = val; } /** Check method */ check() { if (!this._scene) { throw new SceneNotFoundError(); } } /** Render */ render() { if (this.state) { console.warn('Cannot start render engine: already running'); return; } // [0] - last time, [1] - current time, [2] - delta time const timeStack = [Date.now(), 0, 0]; const loop = () => { timeStack[1] = Date.now(); timeStack[2] = timeStack[1] - timeStack[0]; timeStack[0] = timeStack[1]; this.events.emit('before'); this._scene.render(this.ctx); this.events.emit('after'); if (this.state) { requestAnimationFrame(() => loop()); } }; this.state = true; loop(); } } //# sourceMappingURL=Renderer.js.map