import "./style.css"; import * as welcome from "./welcome"; import * as jugando from "./jugando"; import * as win from "./win"; import * as lose from "./lose"; import { Assets, loadAssets } from "./assets"; import { loadSprite, Sprite } from "./sprite"; export type State = welcome.State | jugando.State | win.State | lose.State; export type Juego = { canvas: HTMLCanvasElement; ctx: CanvasRenderingContext2D; assets: Assets; sprites: { [key in | "jugadorx" | "baldosa" | "larreta" | "semilla" | "arbol1" | "arbol2"]: Sprite; }; mouse: { x: number; y: number; down: boolean }; keyboard: { keys: { [key: string]: boolean } }; state: T; }; function update(juego: Juego, dt: number) { switch (juego.state.current) { case "welcome": welcome.update(juego, dt); break; case "jugando": jugando.update(juego, dt); break; case "win": win.update(juego, dt); break; case "lose": lose.update(juego, dt); break; } } function draw(juego: Juego, timestamp: number) { const { width, height } = juego.canvas; juego.ctx.fillStyle = "white"; juego.ctx.fillRect(0, 0, width, height); juego.ctx.fillStyle = "black"; switch (juego.state.current) { case "welcome": welcome.draw(juego, timestamp); break; case "jugando": jugando.draw(juego, timestamp); break; case "win": win.draw(juego, timestamp); break; case "lose": lose.draw(juego, timestamp); break; } } function resizeCanvas(canvas: HTMLCanvasElement) { canvas.width = canvas.clientWidth; canvas.height = canvas.clientHeight; } async function initJuego() { const canvas = document.querySelector("#juego")!; const ctx = canvas.getContext("2d", { alpha: false, desynchronized: true, })!; window.addEventListener("resize", () => resizeCanvas(canvas), false); resizeCanvas(canvas); const assets = await loadAssets(); const sprites = { jugadorx: loadSprite( assets.jugadorx, 65, 94, (juego) => juego.canvas.height / 4 ), baldosa: loadSprite( assets.baldosa, 72, 72, (juego) => juego.canvas.height * 0.8 ), larreta: loadSprite( assets.larreta, 50, 71, (juego) => juego.canvas.height / 4 ), semilla: loadSprite( assets.semilla, 72, 73, (juego) => juego.canvas.height / 8 ), arbol1: loadSprite( assets.arbol1, 72, 68, (juego) => juego.canvas.height / 3 ), arbol2: loadSprite( assets.arbol2, 72, 56, (juego) => juego.canvas.height / 4 ), }; let juego: Juego = { canvas, ctx, assets, sprites, mouse: { x: 0, y: 0, down: false }, keyboard: { keys: {} }, state: { current: "welcome", }, }; (window as any).juego = juego; juego.ctx.imageSmoothingEnabled = false; canvas.addEventListener( "mousemove", (e) => { juego.mouse.x = e.clientX; juego.mouse.y = e.clientY; }, false ); canvas.addEventListener( "mousedown", () => { juego.mouse.down = true; }, false ); canvas.addEventListener( "mouseup", () => { juego.mouse.down = false; }, false ); window.addEventListener("keydown", (e) => { juego.keyboard.keys[e.key] = true; }); window.addEventListener("keyup", (e) => { juego.keyboard.keys[e.key] = false; }); let lastRender = 0; const loop: FrameRequestCallback = (timestamp) => { const progress = timestamp - lastRender; update(juego, progress); draw(juego, timestamp); lastRender = timestamp; window.requestAnimationFrame(loop); }; window.requestAnimationFrame(loop); } initJuego();