Saltar al contenido
Animación3 min de lecturaGitHub ↗

Un archivo de Rive falla sin avisar

Un .riv es un programa compilado, no una imagen: puede cargar bien y aun así ignorar un clic, brincar en el loop o sentirse muerto. Hice un linter y un método para atrapar eso antes de publicar.

Un archivo .riv parece una imagen que se mueve, pero es un programa compilado. Y los programas, cuando fallan, no siempre avisan.

Puede compilar, cargar y verse bien en la primera prueba, y aun así traer una entrada que nadie lee, así que tu app le manda valores a la nada. O un estado al que entras y del que no hay camino de regreso. O una transición que salta de golpe a una pose en lugar de llegar a ella. O un loop que brinca justo en la costura, porque el último cuadro no se parece al primero. O una rotación escrita en grados cuando Rive espera radianes, y el ícono da cincuenta y siete vueltas.

Nada de eso lanza un error. Por eso armé algo que lo diga por el archivo.

Atrapar lo que no avisa

rive-animator es mi kit para escribir Rive desde código, pensado para agentes de IA y para desarrolladores. Empieza con un linter que revisa la escena antes de que toque producción y que también lee el .riv ya compilado. RML011 marca una entrada declarada que ninguna condición ni listener lee. RML012 marca una transición a una pose sin mezcla, la que salta. RML013 marca un loop cuyo último key no coincide con el primero. Otra serie revisa el binario: archivos truncados, sin artboard, sin capas, con nombres de entrada duplicados.

Lo que el linter no atrapa lo renderizo. Un estado sin regreso solo aparece cuando alguien da dos clics, así que cada receta se graba en el runtime real de Rive, con un script moviendo las entradas igual que lo haría una app. Son nueve recetas, desde un switch y un corazón de like hasta un anillo de progreso y una mascota.

Una mascota que respira

La otra mitad del problema es el archivo que funciona perfecto y se siente muerto. Todo se mueve al mismo tiempo, cada pose frena en seco, el color cambia de golpe en vez de mezclarse y entre una acción y otra no pasa nada.

La mascota es una bolita color coral con un brote. Si no la tocas, respira. De vez en cuando parpadea. Si el cursor entra, sus ojos lo siguen. Si das clic, se agacha, salta y cae contenta, y cuando el cursor se va lo despide con la mirada.

El salto es la acción, pero lo que la vuelve alguien es lo que hace cuando no pasa nada: respirar, parpadear, mirar. Mi regla es una acción principal y capas de reposo que nunca se detienen. El método viene del skill de movimiento de rossark0, que traduje a RML.

Un detalle técnico que me gustó resolver: Rive suaviza cada tramo de keyframes por separado, así que una cadena de poses frena en cada una. Un script mío, motion_keys.py, escribe las curvas para que el movimiento pase por todas las poses sin detenerse ni pasarse.

Un archivo que carga todavía no es un archivo que funciona. Yo ya no doy por bueno un .riv hasta que pasa el linter y lo veo moverse. El repositorio es abierto, con licencia MIT.