De imagen a pixel art animado
El resultado debe mantenerse fiel a la fuente: corrige lo que la reducción a tamaño píxel dañó, nunca inventes detalles. En movimiento, el enemigo son las roturas: cualquier píxel que salte, se rompa, aparezca o parpadee. Claude no puede ver un GIF, por lo que cada presentación va precedida de comprobaciones medidas, nunca de "se ve bien en una imagen fija".
Si el usuario guarda preferencias de pixel art (en su CLAUDE.md o en un archivo al que apunte), léelas primero; estas anulan los valores predeterminados aquí. Necesita el MCP de Aseprite: references/aseprite-mcp.md. Léelo cuando llegues a esa etapa: references/still-recipe.md, references/motion-and-breaks.md.
Flujo de trabajo
Cada confirmación es un mensaje: una imagen lado a lado (fuente | antes | después, o un GIF más un flip-book recortado) y una pregunta. Copia el archivo actual a _vN antes de cada cambio, para que una ronda rechazada pueda revertirse desde ahí. Cada ronda hace exactamente el cambio solicitado y nada más.
- Breve. Pregunta qué se desea antes de planificar: qué partes se mueven, cuánto y qué tan rápido, qué se queda quieto, qué está protegido. Escribe un plan breve (media página) y obtén un sí. Terminado cuando el usuario aprueba el plan.
- Fuente. Recorta o redimensiona la fuente para que su tamaño sea exactamente 3 veces el sprite objetivo (aproximadamente 200-260 px de ancho). Los scripts asumen 3x.
- Imagen fija (
1_still.lua, luego correcciones con2_local_rerender.lua,3_join_outline.lua). Mide los parámetros en still-recipe.md para esta imagen. Confirmaciones en orden: manos, luego cara y ojos, luego contornos, metal y fondo. Terminado cuando cada parte está aprobada y la imagen fija se guarda como*_still_FINAL. - Poses de parpadeo (
4_blink_poses.lua, trazos de ojos a mano a 14x). Muestra las cuatro poses lado a lado más un GIF de parpadeo en una sola confirmación, construido como en motion-and-breaks.md. Terminado cuando se aprueba. - Movimiento (
5_animation_frames.lua). Llena su bloque SETTINGS a partir de las mediciones de la imagen fija, ejecuta conBF_ZERO = trueprimero (debe cambiar 0 px), luego la ejecución real, luego6_deflicker_metrics.lua. Pasa las comprobaciones a continuación, luego muestra el GIF completo más un flip-book recortado de la parte en movimiento. - Efectos (
8_effects.lua, solo color, después del desparpadeo). Comprueba, luego muestra. - Extras una solicitud a la vez (brazos, agua, ...), cada una con su propia confirmación.
- Final. Copia a
*_FINAL(.aseprite+ GIF 3x), conservando los finales anteriores.
Comprobaciones antes de cada confirmación de animación
| Comprobación | Pasa | Dónde |
|---|---|---|
| Renderizado con desplazamiento cero igual a la pose | 0 px cambiados con BF_ZERO | 5 |
| Partes rígidas (manos) exactas | el cuadro de cada fotograma, desplazado hacia atrás por su elevación en píxeles enteros, es igual a la imagen fija: 0 px | comparación propia en Lua |
| Parpadeos de un fotograma (A→B→A) | ninguno fuera del parpadeo y los efectos | 6 los imprime |
| Saltos | los fotogramas de paso listados en BA_STEPS están excluidos; cada otro fotograma tiene ≤ ~2x la mediana de píxeles cambiados, y cualquier fotograma por encima tiene una causa nombrada | 6 |
| Mapa de calor | sin rojo (≥ 8 cambios por bucle) en contornos, correas, pestañas, ojos | 7_flicker_heatmap.lua |
| Efectos | cada píxel de efecto se mantiene ≥ 2 fotogramas; el conteo de píxeles cambiados está por encima de 0 (una mezcla débil puede volver al mismo color de paleta) | 8 imprime conteos |
| Ojo cerrado | sin color de iris restante en los fotogramas cerrados | view_sprite a 12x |
| Flip-book | 8-16 fotogramas de manos, cara y cada borde en movimiento a 6x+ se ven continuos | view_sprite región + fotogramas |
Scripts (scripts/)
Cada script necesita PA_DIR (carpeta del proyecto, terminando en el separador de ruta: \ en Windows, / en macOS) y PA_SRC (nombre del archivo de imagen fuente) configurados primero, además de sus propias globales listadas en su encabezado. Ejecútalos mediante run_lua_script con un lanzador corto; <skill> es el directorio base de esta habilidad, proporcionado cuando la habilidad se carga:
PA_DIR, PA_SRC = [[/ruta/al/proyecto/]], "referencia.jpg"
BF_POSES, BF_OUT, BF_PUSH = "blink_poses.aseprite", "frames", true
dofile([[<skill>/scripts/5_animation_frames.lua]])
| Script | Hace |
|---|---|
1_still.lua | Reducción 3x3 preservando líneas, paleta k-means + acentos, paso de pecas, fusión de huérfanos |
2_local_rerender.lua | Re-renderiza cuadros con otro umbral de línea o con colores extra (manos, labios) |
3_join_outline.lua | Une contornos punteados donde la fuente tiene una línea fina |
4_blink_poses.lua | Poses abierta, media, cercana, cerrada (los trazos de ojos en el archivo son por imagen) |
5_animation_frames.lua | Todos los fotogramas; cada coordenada vive en su bloque SETTINGS (valores de ejemplo incluidos) |
6_deflicker_metrics.lua | Desparpadeo, parpadeos, comprobación de saltos (BA_SKIP cuadros rígidos, BA_STEPS fotogramas de paso) |
7_flicker_heatmap.lua | PNG de mapa de calor |
8_effects.lua | Luz aplastada, destello, destellos marinos, brillos de arena (bloque SETTINGS por imagen) |
checkin_sheet.lua | Hoja fuente / antes / después para una región |
example_metal_rerender.lua | Ejemplo práctico solamente: metal re-renderizado con bandas de sombra de la fuente |
5_animation_frames.lua contiene los tipos de movimiento encontrados hasta ahora (banda de respiración, cúpulas suaves, cuadros de movimiento, empuje rígido de píxeles enteros, segmentos de extremidades, mar). Una nueva imagen con diferentes partes en movimiento agrega un campo allí.