import { Point } from "./vector" export interface IDrawable2D { draw(context: CanvasRenderingContext2D) } export interface ISprite { next(delta: number): boolean reset() } export abstract class DrawableObject implements IDrawable2D { position: Point = { x: 0, y: 0 } abstract draw(context: CanvasRenderingContext2D) } export class Group extends DrawableObject { draw(context) { for (let child of this.children) { context.save() context.translate(this.position.x, this.position.y) child.draw(context) context.restore() } } children: IDrawable2D[] = [] } export abstract class FrameSprite extends DrawableObject implements ISprite { // fps = 20 frameInterval = 50 abstract generateFrames(): ImageSlice[] frames: ImageSlice[] frameIndex = 0 time = 0 next(delta) { if (!this.frames) { this.frames = this.generateFrames() } this.time += delta let offset = Math.floor(this.time / this.frameInterval) % this.frames.length let currentFrame = this.frames[offset] return true } reset() { this.frameIndex = 0 this.time = 0 } } export interface ImageSlice { image: HTMLImageElement offsetX: number offsetY: number }