← LibraryKitmormon/starter-match-3
Clone
fogon pieces add starter-match-3git clone https://git.fogon.gg/mormon/starter-match-3.gitfogon new starter-match-3 --from starter-match-3https://fogon.gg/piece/47/kit-de-inicio-match-3Kit de inicio: match-3
El Starter Kit Match-3 de Kenney, que es un proyecto de Godot, pasado a TypeScript y un canvas 2D para Fogón: la misma mecánica, los mismos tamaños y los mismos tiempos. Un tablero de 8 × 8, fichas que se intercambian arrastrando, líneas de tres o más que se borran, lo de arriba que cae y fichas nuevas que entran, en cadena, con sus rebotes, sus chispas y sus sonidos.

En la demo: arrastrá una ficha hacia la de al lado (con el mouse o con el dedo). Si quedan tres iguales en línea, se van; si no, vuelven a su lugar. ?width=6&height=10 en la dirección cambia el tamaño del tablero.
Es solo la página. No hay sala ni red: todo pasa en el navegador de cada uno. server/room.ts es la sala vacía que Fogón le pide a cualquier proyecto.
Qué es de quién
- El kit original (el código en GDScript) es de Kenney, con licencia MIT: su texto está en [
LICENSE-kenney.md](LICENSE-kenney.md). - El fondo, la chispa, las manos del cursor, los sonidos y tres de las fichas (la gema, el pasto y los pinches) son de Kenney y están en dominio público (CC0).
- Dos fichas no son las del kit. Las suyas llevan el logo de Godot y un personaje con el nombre de Kenney; acá hay en su lugar un bloque azul con una estrella y un corazón, pintados por código en el mismo estilo (
client/match3/tiles.ts). - El port a TypeScript es nuestro, también MIT. El kit no tiene texto; la letra de la demo es Lilita One, de Google Fonts.
Los archivos
Todo lo que se reusa está en client/match3/ y no necesita ningún paquete. client/main.ts es solo la demo: crea el juego y cuenta las fichas que se van.
| Archivo | Qué tiene | En el kit de Godot |
|---|---|---|
game.ts | Match3: el tablero, el arrastre, las líneas, la caída, el relleno, las chispas y el dibujo | scripts/main.gd, tile.gd, particles.gd, las escenas |
tween.ts | las curvas de los movimientos, como las calcula Godot: backOut, elasticOut, curve | Tween, Curve |
audio.ts | Sounds: la cola de sonidos, con tono y volumen | scripts/audio.gd |
tiles.ts | paintTile("star" | "heart"): las dos fichas pintadas | |
assets.ts | loadAssets(): baja las imágenes y los sonidos | la carpeta del proyecto |
index.ts | exporta todo lo anterior |
Cómo se usa en un juego
fogon pieces add starter-match-3
Eso trae client/match3/. Las imágenes y los sonidos (400 KB) no viajan con el juego: se cargan de la demo publicada de esta pieza (https://play.fogon.page/starter-match-3/match3/).
import { loadAssets, Match3 } from "./match3";
const canvas = document.querySelector("canvas")!; // con su tamaño dado por CSS
const game = new Match3(canvas, await loadAssets(), { width: 8, height: 8 });
let score = 0;
game.onMatch = (tiles, combo) => (score += tiles.length * 10 * combo); // combo: 1, 2, 3… en una cadena
game.onSwap = (matched) => console.log(matched ? "bien" : "esas no hacen línea");
game.onSettled = () => console.log("el tablero espera otra jugada");
game.start(); // dibuja y avanza solo; con un bucle propio: game.update(dt) y game.draw()
El juego escucha el mouse y los dedos sobre el canvas, se acomoda cuando cambia el tamaño de la ventana y prende el sonido con el primer toque. Para servir los archivos desde tu juego, copiá public/match3/ de esta pieza a tu public/ y cargalos con loadAssets({ base: "./match3/" }).
Otro tablero, otras fichas
const assets = await loadAssets();
const coin = new Image();
coin.src = "./moneda.png"; // 128 × 128, con su borde adentro
await coin.decode();
new Match3(canvas, assets, {
width: 6,
height: 9,
tiles: [...assets.tiles, coin], // seis clases de ficha: más difícil
background: false, // el fondo lo pone la página
});
Una ficha es una imagen cuadrada (se dibuja de 64 px sobre un tablero de 68 px por casilla); su clase es su lugar en la lista. paintTile muestra cómo pintar una por código, con el borde blanco y la línea oscura de las del kit.
Lo que se puede mirar y tocar
game.grid[columna][fila] es la ficha de cada casilla (type, column, row), game.findMatches() las que están en línea ahora, game.swap(a, b) hace una jugada como si la hubieran arrastrado, y game.swapping dice si el tablero todavía se está acomodando.
Lo que quedó distinto del original
- Las dos fichas con logo, cambiadas por las pintadas (arriba).
- El primer tablero espera. En el kit se puede agarrar una ficha mientras el tablero recién armado todavía borra sus líneas; acá se puede recién cuando queda quieto, como después de cualquier jugada.
- En pantallas angostas el tablero se agranda hasta ocupar el ancho. En el kit, la pantalla de 1280 × 720 se achica entera y en un teléfono parado el tablero queda diminuto.
- El fondo cubre toda la pantalla (recortado si hace falta) en vez de quedar del tamaño de la pantalla del kit.
- Las chispas eran partículas de la placa de video; acá son cuatro imágenes dibujadas con los mismos números.
Límites
- Como el kit: no hay puntaje, ni jugadas contadas, ni fin de partida, y no revisa si quedan jugadas posibles. Es una base; los avisos (
onMatch,onSwap,onSettled) son para armar eso encima. - Un solo jugador. Para hacerlo entre varios hace falta una sala que reparta el tablero.
- Los sonidos son
.ogg, como en el kit: los Safari viejos no los reproducen, y ahí el juego anda mudo.
Licencia
MIT (el código, de Kenney y nuestro). Imágenes y sonidos: CC0, de Kenney; las dos fichas pintadas, MIT.
Pick a file.
| Version | When | Size | Commit |
|---|---|---|---|
| v1 in the demo | Nov 12, 2026 | 808 KB | 6418080 |
Nobody has published a version made from this piece yet.
Put together the request for your agent
Pick what you want to do, copy the request and paste it into your AI (Claude, ChatGPT, Codex…). It does the rest.