JARU 0.9.6: motor de físicas nuevo, sonido y música, y VM para ESP32-P4
Ya está disponible JARU 0.9.6, y es con diferencia el salto más grande del proyecto hasta la fecha. No es una versión de retoques: hay un motor de físicas nuevo escrito desde cero, un sistema de sonido y música que antes sencillamente no existía, una máquina virtual nueva para ESP32-P4 y dos incorporaciones al lenguaje.
Si vienes de 0.9.5, merece la pena leer el apartado de cambios incompatibles antes de recompilar tus proyectos: son pocos, pero hay tres que pueden requerir tocar código.

Motor de físicas y colisiones nuevo
El motor anterior se sustituye por uno nuevo completo —broadphase, narrowphase, solver de contactos y colisión contra el grid— presente en las tres VMs y validado con baterías propias de pruebas.
Lo que aporta en la práctica:
- Rotación real: el centro de masas pasa a ser el centro del collider, el collider gira con el sprite y el
spininvalida la caché de rotación. Antes un impulso podía crear un par fantasma y hacer que el cuerpo orbitase su propia esquina. - Fricción de Coulomb, acotada por el impulso normal, con fricción estática de verdad en rampas.
sleepingpor islas de contacto: los cuerpos en reposo dejan de consumir CPU, y despiertan juntos los que se tocan.- Torque:
applyTorque(t)para un par puro yapplyForceAt(fx, fy, px, py)para una fuerza aplicada en un punto del mundo. - CCD con
sprite.bullet: un proyectil rápido ya no atraviesa a otro cuerpo entre dos pasos de simulación. - Filtros de colisión por bits con
categoryycollideWith, y propiedades por cuerpo comogravityScale,damping,angularDampingorotates.
La colisión contra GridMap se ha rehecho: recolocación absoluta en la cara del tile, filtro de caras internas (las ghost collisions que obligaban al truco del doble collider), red anti-embebido rediseñada y hitsGrid() reportando otra vez todos los tiles solapados, como decía la documentación.
Callbacks de impacto estilo Angry Birds
La forma reactiva de tratar los golpes: en vez de consultar hits() cada frame, el motor te avisa con la fuerza del impacto y te deja poner un umbral mínimo.
// Solo los golpes fuertes cuentan
caja.onCollision(fn(yo, otro, impulso, nx, ny):
println("¡golpe de ", impulso, "!")
yo.active = false
end, 300)
Un límite conocido
Prefiero decirlo antes de que lo descubras tú: el motor no sostiene apilamientos de dos o más cuerpos dinámicos en reposo. Hay bombeo de energía porque falta warm-starting de contactos, está medido y analizado, y ninguna opción del .aru lo evita. Una torre de cajas quietas todavía no es un caso de uso realista; el resto de la física sí.
Sonido y música
Todo este bloque es nuevo: 0.9.5 no tenía sistema de sonido.
- Siete canales: cuatro de tono, uno de ruido y dos de PCM.
- Envolventes ADSR por instrumento, con modelo gate al estilo SID.
- Formas de onda cuadrada, sierra, triangular, pulso y senoidal, con filtro polyBLEP.
- PWM y trémolo por instrumento y por canal (
Sound.pwm,Sound.tremolo), además del vibrato. - Afinación exacta en mili-hercios, independiente del sample rate, con los graves afinados de verdad.
Sound.tone,pulseyslideFreqaceptan frecuencias con decimales:Sound.tone(0, 65.406, 200). - Sample rate por perfil de placa (22050 o 44100), con el reloj del ruido fijo para que una canción suene igual en las dos.
- Anti-chasquido: retrigger legato sin corte a cero, fase libre del oscilador y arranque de cada onda en su cruce por cero.
![]()
En el IDE, el tracker de música ya no es un experimento: tiene editor gráfico de instrumentos con ADSR, PWM y trémolo, selector de presets General MIDI, copiar/cortar/pegar, selección múltiple de filas y un reproductor de previsualización que espeja el motor de la VM —el mismo anti-chasquido, el mismo bus máster y el sample rate del perfil de placa activo—, para que lo que oyes al componer sea lo que suena en la placa.
El importador de MIDI también ha mejorado: ahora respeta la expresión (CC11 combinado con CC7), conserva el volumen nominal de cada timbre y afina el pitch bend en mili-hercios.
VM para ESP32-P4
Hay una VM nueva para ESP32-P4, con manejo de doble buffer y drivers de pantalla MIPI-DSI (ST7703 y ST7701). En ESP32 y ESP32-S3 se añade fallback automático a PSRAM cuando no cabe el doble buffer en SRAM.
Además: LovyanGFX actualizado a 1.2.21, driver QSPI, buses SPI unificados y un platformio.ini que soporta las dos placas a la vez sin cambiar de fichero.
Lenguaje: struct, lambdas fn y callbacks unificados
El tipo struct es un registro de datos ligero: campos fijos, almacenados por índice en un bloque compacto, sin tablas hash. Ocupa varias veces menos memoria que una instancia de clase y se crea mucho más rápido, que en un ESP32 se nota.
struct Point
var x = 0
var y = 0
end
var p = Point(3, 4)
println(p.x, ", ", p.y)
Las lambdas fn son funciones anónimas con captura por referencia (incluido this dentro de un método):
var doble = fn(x): return x * 2 end
println(doble(21)) // 42
Timer.every(1000, fn(id, p, u):
println("tic")
end)
Y los callbacks quedan unificados: donde antes cada módulo aceptaba una cosa distinta, ahora Timer, las interrupciones de gpio, MQTT.subscribe y sprite.onCollision admiten los cuatro estilos por igual: una referencia directa (miFuncion), un método de objeto (objeto.metodo), un nombre en string ("miFuncion") o una lambda fn en línea.
IDE

- ESP32 Tools rediseñado, con perfiles de hardware y dispositivos de usuario, y gestión de buses de display independiente del chip controlador: todos los controladores y todos los buses (SPI, QSPI, I80, MIPI-DSI) aparecen en cualquier SoC y eliges la combinación correcta.
- Inteligencia del código más robusta: miembros heredados en el completado y en el call-tip, Ctrl+clic y hover resolviendo cadenas de tres o más niveles, soporte completo de
struct(incluido el Watch desplegable y el completado de campos) y de lambdasfn, detección de ciclos de herencia y menos falsos positivos. - Editores de recursos: undo/redo en el editor de tilemaps, corrección del crop del editor de imágenes, iconos en las barras de herramientas y aviso de modificación en el editor de sprites.
- Agente de generación de drivers I2C por IA lanzado desde el Python embebido del IDE.
Cambios incompatibles
| Cambio | Qué hacer |
|---|---|
sprite.spin respeta ya los grados por segundo (llevaba un factor 60 de más) | Multiplicar por 60 los valores antiguos para conservar la velocidad que veías |
sprite.acceleration queda obsoleto como alias de sprite.force; se retirará en 1.0 | Renombrar a force cuando sea cómodo |
scene.maxDelta es ahora propiedad de cada escena, no un global de fichero | Fijarlo en cada escena que lo necesite |
friction y elasticity se acotan a 0-1 | Los valores fuera de rango producían NaN o ganaban energía; ya no se aceptan |
| La fricción entre sprites es de Coulomb | Los juegos que dependían del frenado viscoso anterior notarán el cambio |
| Los mensajes de error de la VM están todos en inglés | Solo afecta a código que compare el texto de e.message; compara el código de error |
La partición de aplicación del ESP32-S3 crece a 0x160000 | Hace falta un flasheo completo, firmware y filesystem |
Y una nota general: recompila el proyecto tras actualizar, para regenerar los recursos con el compilador nuevo. Las canciones .jmu y el bytecode de versiones anteriores no se cargan.
Descarga
JARU IDE 0.9.6 para Windows está disponible en la web:
Descomprime el ZIP y ejecuta el instalador que hay dentro. Si ya tienes el IDE instalado, él mismo te avisará de que hay versión nueva.
FAQ
¿Tengo que recompilar mis proyectos de 0.9.5?
Sí. El compilador y el formato de los recursos han cambiado, así que hay que regenerar el bytecode y la música. Revisa además la tabla de cambios incompatibles: sprite.spin, sprite.acceleration y scene.maxDelta son los tres puntos que pueden requerir tocar código.
¿El motor de físicas sirve para un juego de plataformas?
Sí, y es justo el caso que más se ha probado: colisión contra GridMap con plataformas one-way, onGround fiable, fricción real y filtros de colisión. Lo que todavía no sostiene bien son las pilas de cuerpos dinámicos en reposo.
¿Necesito una placa ESP32-P4 para usar 0.9.6?
No. El desarrollo sigue empezando en la VM de Windows, y la versión funciona igual en ESP32 y ESP32-S3. La VM de P4 es una plataforma más, para quien tenga esa placa y quiera usar pantallas MIPI-DSI.
¿La música se puede usar en un ESP32 normal?
Sí. El motor de sonido está en las tres VMs. El sample rate se elige por perfil de placa (22050 o 44100) y el reloj del ruido es fijo, así que la misma canción suena igual en una placa y en otra.