64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
import { clearScreen, fillRect, setPixelColor } from "./window.ts";
|
|
import { fontWidth, fontHeight } from "./font.ts";
|
|
import { drawText, drawSprite } from "./builtins.ts";
|
|
import { COLOR } from "./colors.ts";
|
|
import {getSheet, setSheet} from "./sheet.ts";
|
|
|
|
const state = {
|
|
selectedIndex: 0,
|
|
get sprites() {
|
|
const {sheet_type, value} = getSheet(2);
|
|
if (sheet_type !== "spritesheet") {
|
|
throw "Trying to use a non-sprite sheet as a spritesheet."
|
|
}
|
|
return value;
|
|
},
|
|
set sprites(val) {
|
|
setSheet(0, "spritesheet", val);
|
|
}
|
|
}
|
|
|
|
const update = () => {
|
|
}
|
|
|
|
const draw = () => {
|
|
const {sprites, selectedIndex} = state;
|
|
clearScreen();
|
|
fillRect(0, 8, 128, 112, COLOR.BROWN);
|
|
// Draw the palette
|
|
const paletteX = 88;
|
|
const paletteY = 12;
|
|
fillRect(paletteX-1, paletteY-1, 32+2, 32+2, COLOR.BLACK);
|
|
Object.keys(COLOR).forEach((name, i) => {
|
|
const swatchX = paletteX+8*(i%4);
|
|
const swatchY = paletteY+8*Math.floor(i/4);
|
|
fillRect(swatchX, swatchY, 8, 8, COLOR[name as keyof typeof COLOR]);
|
|
if (i === 0) {
|
|
// transparent
|
|
Array(64).fill(0).map((_z, j) => {
|
|
const jx = j%8;
|
|
const jy = Math.floor(j/8);
|
|
setPixelColor(swatchX+jx, swatchY+jy, (jx+jy)%2 ? COLOR.BLACK : COLOR.WHITE);
|
|
})
|
|
}
|
|
});
|
|
// Draw the current sprite
|
|
const spriteX = 8;
|
|
const spriteY = 12;
|
|
fillRect(spriteX-1, spriteY-1, 64+2, 64+2, COLOR.BLACK);
|
|
sprites[selectedIndex].forEach((pix, i) => {
|
|
fillRect(spriteX+8*(i%8), spriteY+8*Math.floor(i/8), 8, 8, pix);
|
|
});
|
|
// Draw the spritesheet
|
|
const sheetX = 0;
|
|
const sheetY = 88;
|
|
fillRect(sheetX, sheetY-1, 128, 64+1, COLOR.BLACK);
|
|
sprites.forEach((_sprite, i) => {
|
|
drawSprite(sheetX+8*(i%16), sheetY+8*Math.floor(i/16), i);
|
|
});
|
|
}
|
|
|
|
export const spritetab = {
|
|
update,
|
|
draw,
|
|
} |