import { Juego } from "./main" export type Sprite = { getWidth: (juego: Juego) => number; getHeight: (juego: Juego) => number; draw: (juego: Juego, x: number, y: number, spriteIndex?: number, flipped?: boolean) => void; width: number; height: number; } // Sprites are image assets that have a grid of tiles to animate export function loadSprite( img: HTMLImageElement, // The size of each tile width: number, height: number, // Calculates the size of the sprite when rendering getHeight: (juego: Juego) => number, ): Sprite { const aspect = width / height const rowSize = Math.floor(img.width / width) if (img.width / width !== rowSize) { console.warn(`The sprite grid for ${img.src} has extra space after rows, are you sure the width/height of each tile is right?`) } function getWidth(juego: Juego) { return getHeight(juego) * aspect } function draw(juego: Juego, x: number, y: number, spriteIndex = 0, flipped = false) { const drawHeight = getHeight(juego) const drawWidth = getWidth(juego) const tileX = spriteIndex % rowSize const tileY = Math.floor(spriteIndex / rowSize) if (flipped) { juego.ctx.save() juego.ctx.scale(-1, 1) juego.ctx.drawImage( img, tileX * width, tileY * height, width, height, -x - drawWidth, y, drawWidth, drawHeight, ) juego.ctx.restore() } else { juego.ctx.drawImage( img, tileX * width, tileY * height, width, height, x, y, drawWidth, drawHeight, ) } } return { getWidth, getHeight, draw, width, height } }