Engine 2D pixel-art & games mobile-first · sprite builder programático + Phaser carregado da CDN Iandara em runtime.
Walking animation com legs alternados e braços opostos. Palette-swappable: altere as cores e redesenhe a forma.
Casa pixel com variação dia/noite. Demonstra .fill(), ramp() e layer frame-dependente via .v(key).
Árvore com balanço ao vento em 3 frames. Usa .layer(s => ...) para a copa se mover em relação ao tronco fixo.
Builder declarativo: .palette(), .rect(), .frames(n, fn), .layer(fn). to_ops(frame) é puro
(sem browser) — testável via node --test. to_canvas(frame) rasteriza.
Gradiente de céu com estrelas, lua e silhueta de montanhas procedurais. Cada seed gera uma paisagem determinística diferente. Cores
top/mid/bottom configuram o tema.
Fileiras de árvores pixel para parallax de fundo. shade controla o tom (0 = mais claro/frente, 1 = mais escuro/fundo).
Silhueta procedural como array de pontos [[x, y], …] normalizados (0..1). Puro — sem DOM, testável com
node --test. Seed garante determinismo.
ramp(cor) gera 4 tons: dark / main / light / highlight. PALETTES.retro traz um conjunto pré-construído. Use em
sprites para sombra e destaque automáticos.
Leve lobo 🐺, ovelha 🐑 e repolho 🥦 para a margem direita. O barco carrega o fazendeiro e no máximo 1 item. Lobo + ovelha sem fazendeiro = problema. Ovelha + repolho sem fazendeiro = problema. Use Dica para o BFS sugerir o próximo movimento.
Solução ótima tem 7 travessias. rate(moves, 7) retorna estrelas baseado na eficiência.
O BFS é agnóstico ao domínio. actions(state) retorna as ações válidas do estado atual. apply(state, action) deve ser
não-mutante.
O Phaser 3.80.1 é carregado lazy da CDN Iandara via ensure_phaser(). O pacote também expõe
viewport_dims(), layout_metrics(), game_hud_layout(), create_choice_sheet() e
create_paged_panel() para jogos mobile-first sem overlap.
Phaser carrega da CDN Iandara no primeiro clique.
Desktop: ← → | Mobile: D-pad touch.
Phaser é UMD clássico (seta window.Phaser). O loader injeta um <script> sem type=module e resolve o global.
Promise é cacheada — segunda chamada é instantânea.
Sem src/ — módulos no root do package, orquestrados pelo main.mjs e empacotados pelo build.mjs.