// Sprite: personagem ou item em pixel art desenhado por grade de texto (cada letra = uma cor da paleta de 8 bits). // Pula, flutua ou gira em passos. Props: nome, x, y (centro), escala (px por pixel do sprite), movimento, inicio. import React from 'react'; import {COR, mola, seg, useF} from '../base'; const PAL: Record = {k: COR.noite, w: COR.creme, y: COR.amarelo, o: COR.laranja, m: COR.magenta, b: COR.azul, g: COR.verde, p: COR.roxo, s: COR.cinza}; export const SPRITES: Record = { bloco: ['..kkkkkkkk..', '.kyyyyyyyyk.', 'kyyyyyyyyyyk', 'kyykkyykkyyk', 'kyykwyykwyyk', 'kyyyyyyyyyyk', 'kyoyyyyyyoyk', 'kyyykkkkyyyk', 'kyyyyyyyyyyk', '.kyyyyyyyyk.', '.kkk....kkk.', 'kkkkk..kkkkk'], moeda: ['...kkkk...', '..kyyyyk..', '.kyywyyok.', 'kyywyyyyok', 'kywyyooyok', 'kywyyooyok', 'kyyyyyyyok', '.kyyyyook.', '..kooook..', '...kkkk...'], coracao: ['.kkk...kkk.', 'kmmmk.kmmmk', 'kmwmmkmmmmk', 'kmwmmmmmmmk', 'kmmmmmmmmmk', '.kmmmmmmmk.', '..kmmmmmk..', '...kmmmk...', '....kmk....', '.....k.....'], estrela: ['.....k.....', '....kyk....', '....kyk....', '...kywyk...', 'kkkkywyykkk', 'kyyywyyyyyk', '.kyyyyyyyk.', '..kyyyyyk..', '..kyykyyk..', '.kyykkkyyk.', '.kkk...kkk.'], foguete: ['....k....', '...kwk...', '..kwwwk..', '..kwbwk..', '..kwwwk..', '..kwwwk..', '.kwwwwwk.', '.kwwwwwk.', 'kmkwwwkmk', 'kmk...kmk', '.k.kyk.k.', '...kyk...', '....k....'], cogumelo: ['...kkkkkk...', '..kmmwwmmk..', '.kmmwwwwmmk.', 'kmmmwwwwmmmk', 'kwwmmmmmmwwk', 'kwwmmmmmmwwk', 'kkkkwwwwkkkk', '...kwkkwk...', '...kwwwwk...', '....kkkk....'], }; export type SpriteProps = { nome?: keyof typeof SPRITES | string; x?: number; y?: number; escala?: number; inicio?: number; movimento?: 'pular' | 'flutuar' | 'parado'; espelhar?: boolean; /** troca a cor 'y' por outra (ex.: estrela verde) */ cor?: string; sombra?: boolean; }; export const Sprite: React.FC = ({nome = 'bloco', x = 540, y = 760, escala = 40, inicio = 0, movimento = 'pular', espelhar = false, cor, sombra = true}) => { const f = useF() - inicio; const g = SPRITES[nome] ?? SPRITES.bloco; const w = g[0].length, h = g.length; const nasce = mola(seg(f, 0, 9)); const t = Math.max(0, f - 9); const pulo = movimento === 'pular' ? Math.abs(Math.sin(t / 7.2)) * escala * 3.2 : movimento === 'flutuar' ? Math.sin(t / 8) * escala * 0.8 : 0; const esc = Math.max(0.01, nasce); const rects: React.ReactNode[] = []; g.forEach((lin, j) => [...lin].forEach((ch, i) => { if (ch !== '.') rects.push(); })); return
{sombra &&
} {rects}
; };