raingame
Version:
2D game framework
101 lines (93 loc) • 3.41 kB
text/typescript
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
}