UNPKG

raingame

Version:
101 lines (93 loc) 3.41 kB
import { StandardObject } from './src/StandardObject'; import RainImage from './src/RainImage'; import { Card } from './src/Card'; import Size from './src/Size'; import { touchTypes } from './src/types/Types'; import { addClickEvent } from './src/events/events'; import SceneItem from './src/interfaces/SceneItem'; import SceneGroup from './src/SceneGroup'; import Files from './src/Files'; export class Renderer { domElement: HTMLCanvasElement; ctx: CanvasRenderingContext2D; devicePixelRatio: number; private size: Size; constructor(width: number, height: number) { if (!width || !height) throw new Error("Renderer need set width and height"); let cav = document.createElement("canvas"); this.devicePixelRatio = window.devicePixelRatio; cav.width = this.devicePixelRatio * width; cav.height = this.devicePixelRatio * height; this.size = new Size(cav.width, cav.height); this.domElement = cav; let ctx: CanvasRenderingContext2D; let ctxOrign = cav.getContext('2d'); if (ctxOrign) { ctx = ctxOrign; ctx.fillStyle = "#fff"; ctx.fillRect(0, 0, width, height); this.ctx = ctx; } else { throw new Error("browser don't support Canvas.") } } render(scene: Scene) { let ctx = this.ctx; let { width, height } = this.size; ctx.clearRect(0, 0, width, height); scene.children = scene.children.sort((a, b) => a.rank - b.rank); for (let index = 0; index < scene.children.length; index++) { let element = scene.children[index]; element.rank = index; if (element.target instanceof SceneGroup) { element.target.children = element.target.children.sort((a,b)=>a.groupRank-b.groupRank); for (let index2 = 0; index2 < element.target.children.length; index2++) { const childElement = element.target.children[index2]; childElement.target.render(ctx,element.target); } }else if (element.target instanceof StandardObject) { element.target.render(ctx,element.target); } } } setSize(width: number, height: number) { this.devicePixelRatio = window.devicePixelRatio; this.domElement.width = this.devicePixelRatio * width; this.domElement.height = this.devicePixelRatio * height; } getSize() { return new Size(this.size.width, this.size.height); } } export enum MouseActions { Click = 'click' } export class Scene { children: Array<SceneItem>; constructor() { this.children = []; } add(newObj: SceneGroup | StandardObject) { let item: SceneItem = { rank: this.children.length, target: newObj } this.children.push(item); } addEvent(type: MouseActions, renderer: Renderer, touchType: touchTypes = touchTypes.RANGE) { let scene = this; switch (type) { case MouseActions.Click: addClickEvent(renderer, touchType, scene); return; } } } export default { Renderer, Scene, StandardObject, RainImage, Card, Files }