import { loadSprite } from './sprite' import { Juego } from './main' import { boxCollision } from './utils' const larretaImg = document.getElementById("img-larreta") as HTMLImageElement const inmobiliariaImg = document.getElementById("img-inmobiliaria") as HTMLImageElement const veredaImg = document.getElementById("img-vereda") as HTMLImageElement const fondoImg = document.getElementById("img-fondo") as HTMLImageElement const jugadorxImg = document.getElementById("img-jugadorx") as HTMLImageElement const semillaImg = document.getElementById("img-semilla") as HTMLImageElement const jugadorxSprite = loadSprite(jugadorxImg, 133, 266, juego => juego.canvas.height / 4) const larretaSprite = loadSprite(larretaImg, 800, 1069, juego => juego.canvas.height / 4) const semillaSprite = loadSprite(semillaImg, 480, 640, juego => juego.canvas.height / 8) export type State = { current: "jugando" pos: { x: number } view: { x: number } velocity: { x: number } side: "left" | "right" enemies: { x: number }[] seeds: { x: number; velocity: { x: number } }[] seedCooldown: number, } export function createJugandoState(): State { return { current: "jugando", pos: { x: 3000 }, view: { x: 0 }, velocity: { x: 0 }, side: "right", enemies: [{ x: 2700 }], seeds: [], seedCooldown: 0, } } export function update(juego: Juego, dt: number) { juego.state.velocity.x = 0 if (juego.keyboard.keys.d || juego.keyboard.keys.ArrowRight) { juego.state.side = "right" juego.state.velocity.x += 200 } if (juego.keyboard.keys.a || juego.keyboard.keys.ArrowLeft) { juego.state.side = "left" juego.state.velocity.x -= 200 } juego.state.pos.x += (dt / 1000) * juego.state.velocity.x if (juego.state.pos.x < 2000) juego.state.pos.x = 2000 if (juego.state.pos.x > 4000) juego.state.pos.x = 4000 juego.state.seedCooldown -= dt if (juego.keyboard.keys[' '] && juego.state.seedCooldown < 0) { juego.state.seeds.push({ x: juego.state.pos.x, velocity: { x: juego.state.side === "left" ? -2000 : 2000 }, }) juego.state.seedCooldown = 300 } for (const seed of juego.state.seeds) { seed.x += (dt / 1000) * seed.velocity.x seed.velocity.x *= 0.9 for (const enemy of juego.state.enemies) { if (boxCollision({ x: seed.x, y: getFloorY(juego) - semillaSprite.getHeight(juego), width: semillaSprite.getWidth(juego), height: semillaSprite.getHeight(juego), }, { x: enemy.x, y: getFloorY(juego) - larretaSprite.getHeight(juego), width: larretaSprite.getWidth(juego), height: larretaSprite.getHeight(juego), })) { juego.state.seeds = juego.state.seeds.filter(s => s.x !== seed.x) juego.state.enemies = juego.state.enemies.filter(e => e.x !== enemy.x) } } } juego.state.view.x = -juego.state.pos.x + juego.canvas.width / 2 - jugadorxSprite.getWidth(juego) / 2 } function drawBackground( juego: Juego, y: number, height: number, img: HTMLImageElement, ) { const aspect = img.width / img.height const width = height * aspect for (let i = 0; i < 10; i++) { juego.ctx.drawImage(img, i * (width - 1) + juego.state.view.x, y, width, height) } } function drawJugadorx(juego: Juego) { const floorY = getFloorY(juego) jugadorxSprite.draw( juego, juego.state.pos.x + juego.state.view.x, floorY - jugadorxSprite.getHeight(juego), 0, juego.state.side === "left", ) } function drawEnemies(juego: Juego) { const height = larretaSprite.getHeight(juego) const floorY = getFloorY(juego) for (const enemy of juego.state.enemies) { larretaSprite.draw( juego, enemy.x + juego.state.view.x, floorY - height, ) } } function drawSeeds(juego: Juego) { const height = semillaSprite.getHeight(juego) const floorY = getFloorY(juego) for (const seed of juego.state.seeds) { semillaSprite.draw( juego, seed.x + juego.state.view.x, floorY - height, ) } } function getFloorY(juego: Juego): number { return (juego.canvas.height / 3) * 2 } export function draw(juego: Juego, timestamp: number) { const { height } = juego.canvas drawBackground(juego, 0, (height / 3) * 2, fondoImg) drawBackground(juego, getFloorY(juego), height / 3, veredaImg) drawEnemies(juego) drawJugadorx(juego) drawSeeds(juego) }