salva-la-costanera/src/sprite.ts

91 lines
2.1 KiB
TypeScript
Raw Permalink Normal View History

2021-06-30 23:16:45 +00:00
import { Juego } from "./main";
2021-06-28 18:01:45 +00:00
export type Sprite = {
2021-06-30 23:16:45 +00:00
getWidth: (juego: Juego<any>) => number;
getHeight: (juego: Juego<any>) => number;
draw: (
juego: Juego<any>,
x: number,
y: number,
spriteIndex?: number,
flipped?: boolean
) => void;
width: number;
height: number;
};
2021-06-28 18:01:45 +00:00
// Sprites are image assets that have a grid of tiles to animate
export function loadSprite(
2021-06-30 23:16:45 +00:00
img: HTMLImageElement,
// Calculates the size of the sprite when rendering
2021-07-05 15:49:06 +00:00
size:
| { width: (juego: Juego<any>) => number }
| { height: (juego: Juego<any>) => number },
tileSize?: { width: number; height: number }
): Sprite {
2021-07-05 15:49:06 +00:00
const width = tileSize ? tileSize.width : img.width;
const height = tileSize ? tileSize.height : img.height;
2021-06-30 23:16:45 +00:00
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?`
);
}
2021-06-28 18:01:45 +00:00
2021-06-30 23:16:45 +00:00
function getWidth(juego: Juego<any>) {
2021-07-05 15:49:06 +00:00
return "width" in size
? size.width(juego)
: (size.height(juego) * width) / height;
}
function getHeight(juego: Juego<any>) {
return "height" in size
? size.height(juego)
: (size.width(juego) * height) / width;
2021-06-30 23:16:45 +00:00
}
2021-06-28 18:01:45 +00:00
2021-06-30 23:16:45 +00:00
function draw(
juego: Juego<any>,
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
);
2021-06-28 18:01:45 +00:00
}
2021-06-30 23:16:45 +00:00
}
2021-06-28 18:01:45 +00:00
2021-06-30 23:16:45 +00:00
return { getWidth, getHeight, draw, width, height };
2021-06-28 18:01:45 +00:00
}