Problemas conocidos
Esta página junta los problemas conocidos de JARU 0.9.7, en el orden de la web y, en cada apartado, primero los más graves. Cada punto dice qué pasa y qué hacer, y lleva a la página que lo cuenta entero. Cuando un problema se arregla, sale de aquí y de su página.
Empezar e instalación
- Run no nota que la placa lleva la VM de la 0.9.6. Un programa compilado con la 0.9.7 se para en la primera instrucción nueva con el error «Unknown Opcode encountered». Después de actualizar JARU IDE, pulsa Flash Firmware en cada placa antes de enviarle programas. Ver Grabar el firmware y ejecutar.
JARU IDE
La interfaz
- Los filtros de la Error List no duran. Cada vez que el editor de código vuelve a analizar el fichero, la lista lo enseña todo otra vez, aunque los botones sigan diciendo «0 of …». Para volver a aplicarlos, escribe en (Filter). Ver La interfaz.
Proyectos
- Cancel en el asistente cierra el IDE. Después de Home › Project › New, Cancel cierra JARU IDE entero, sin preguntar. No se pierde nada más, porque el proyecto ya estaba cerrado: vuelve a abrir el IDE. Ver Proyectos.
Editor de código
- Find y Font no hacen nada, ni en el menú del clic derecho ni en Edit. Para buscar, usa
Ctrl+F; para el tamaño de la letra,Ctrl+ rueda. Ver Editor de código. - Las casillas de buscar y de reemplazar no se vacían. «Search...» y «Replace...» no se borran al hacer clic en ellas: bórralos antes de escribir. Si dejas vacía la de reemplazar y haces clic en otro sitio, R y All reemplazan por «Replace...», y
Ctrl+Zlo deshace. Ver Editor de código. - Atrás no siempre vuelve justo a donde estabas. Tras un salto de menos de 20 líneas pasa de largo, y la flecha de adelante te devuelve; tras saltar a otro fichero, a veces hay que pulsar Atrás dos veces. Ver Editor de código.
Editor de imágenes
- Borrar una imagen abierta con cambios la borra aunque contestes Cancel. El editor te pregunta si guardas sus cambios, y con Cancel deja la pestaña abierta, pero el fichero se borra igual. Ciérrala antes de borrarla. Ver Editor de imágenes.
- El editor no ve los cambios de otro programa, y Save los pisa. Cierra la imagen en el editor antes de cambiarla fuera, y vuelve a abrirla después. Ver Editor de imágenes.
- Rectangle no usa Brush Size: su borde es siempre de 1 píxel. Para uno más grueso, dibuja los lados con Line. Ver Editor de imágenes.
Editor de sprites
- El New Sprite del editor no comprueba el nombre. Con el nombre de un sprite que ya existe, lo abre como si fuera nuevo, y si guardas, lo pisas. Crea los sprites con el New Sprite del explorador, que sí avisa. Ver Editor de sprites.
- Con Offset X u Offset Y, el clic se descuadra. El clic suelto, Auto y la pipeta toman otro sitio: con desplazamiento, corta con la marquesina o con Cut All. Y escribir en esas casillas no mueve la rejilla hasta que haces clic en ellas. Ver Editor de sprites.
- Auto y Cut All no usan el color de la muestra de BACKGROUND, sino el que tomó la pipeta o el que el editor detectó al abrir la hoja. Toma el fondo con la pipeta justo antes. Ver Editor de sprites.
- Sin Remove background, el negro es transparente en el juego, aunque la vista previa lo enseñe. Si el sprite tiene negro puro que se tiene que ver, marca Remove background con un fondo de otro color. Ver Editor de sprites.
Editor de mapas
- Los
.gmapviejos se quedan. Al compilar no se borra lo que había enBuild/flash/Maps: si apagas Include map in build, cambias el tipo de un mapa, lo renombras o lo borras, el de antes sigue ahí, y en la placa ocupa sitio. Bórralo a mano. Ver Editor de mapas. - Un mapa sin fichero no cambia de tamaño. En el mapa que abre Home › View › TileMap, Resize Map y Size no hacen nada. Guárdalo antes, o crea el mapa con New TileMap. Ver Editor de mapas.
- Tiles por encima del 254. El editor deja pintarlos sin avisar, y después la compilación se para. Usa los tiles del 0 al 254. Ver Editor de mapas.
Editor de escenas
Salas, lienzo y Play
Suprcon una capa elegida en el árbol borra los objetos elegidos, no la capa, sin preguntar. Para borrar una capa, usa la papelera de su fila o Delete en el menú del árbol; si ya ha pasado,Ctrl+Zdevuelve los objetos. Ver Editor de escenas.- Generate escribe el código de una sala en solo lectura. Una sala guardada por un IDE más nuevo se abre en solo lectura (READ ONLY), y ni se guarda ni se prueba, pero Generate reescribe igual su
.gen.aruy el runtime compartido. No pulses Generate en esas salas. Ver Editor de escenas. - Play no ve todos los cambios de los recursos. Solo los vuelve a preparar si ha cambiado algún fichero de imagen, sprite, mapa o música: no se entera si renombras, mueves o borras uno, ni de Include in Build o Palette del editor de imágenes. Compila con Build › Compile, que los prepara siempre, o borra
Build/assets.stampantes de Play. Ver Tu primer juego con salas y Editor de imágenes. - El ojo de un objeto lo saca del juego, y
Ctrl+Zno lo deshace. Si lo escondes sin querer, vuelve a pulsar el ojo. Ver Editor de escenas. - El candado y el ojo de una capa no la protegen del todo. La marquesina,
Ctrl+Ay el árbol eligen sus objetos, y Place, Shape, Zone, Path y Paste ponen objetos en la capa activa aunque esté bloqueada. Antes de colocar algo, mira cuál es la capa activa. Ver Capas. - El lienzo no ve los cambios de un sprite o de una imagen que retocas con el editor de escenas abierto: los enseña como estaban. Cierra la ventana del editor y vuelve a abrirla. Ver Editor de escenas.
Ctrla mitad de un arrastre hace saltar la copia. PulsaCtrlantes de empezar a arrastrar; si ya ha pasado,Ctrl+Zlo deja todo como antes. Ver Editor de escenas.
Capas
- La sección LAYER se queda con la capa de antes. Si eliges en el árbol un objeto de otra capa, tocar un campo de LAYER escribe en la capa nueva los valores de la vieja. Antes de tocarla, haz clic en el nombre de la capa en el árbol; si ya ha pasado,
Ctrl+Z. Ver Capas. - El lienzo no pinta los sprites como el juego. El juego pinta todos los sprites junto al mapa de escena, y el lienzo, cada capa de objetos en su sitio de la pila. Para que el lienzo enseñe lo que verás, pon las capas de objetos justo encima del mapa de escena. Ver Capas.
- El orden de los sprites cambia al destruir uno: el último de la lista pasa a su hueco, y desde entonces se pinta antes que otros a los que tapaba. Lo que tenga que ir siempre delante, ponlo en una capa de tiles o de decorado por encima del mapa de escena. Ver Capas.
- Borrar la capa del mapa de escena deja la sala sin él hasta que la vuelves a abrir, y Generate y Play pintan los sprites delante de todas las capas. Marca otra capa de tiles con Scene map, o cierra la sala y vuelve a abrirla. Ver Capas.
- Offset, Scroll y Position no admiten negativos. Una capa o un objeto a la izquierda o por encima de la sala enseña 0, y si cambias el otro eje en la casilla, salta al 0. Muévelos con el ratón, con Move o con las flechas. Ver Capas y Objetos.
- Move puede agarrar otra capa en el margen: un clic fuera de la sala puede arrastrar una capa con Wrap en vez de la activa. Si se mueve la que no era,
Ctrl+Z. Ver Capas.
Objetos
- PROPERTIES no entra bien en el deshacer. Cambiar un valor no deja un paso, y Add con el nombre de una propiedad que ya existe la pone a
0sin avisar. Para cambiar un valor, edítalo en la columna Value. Ver Objetos. - Body no cambia en una imagen: vuelve a Visual, así que una imagen no puede ser una plataforma. Haz un sprite con la imagen y coloca el sprite. Ver Objetos.
- Las comillas dobles llegan al juego con una barra:
Jefe "malo"llega comoJefe \"malo\". No uses comillas dobles en los nombres, las propiedades ni los textos. Ver Objetos. - Las plantillas solo se manejan con un objeto elegido: sin nada elegido, TEMPLATES está apagado. Elige antes cualquier objeto. Ver Objetos.
- Los nombres de las copias: al duplicar o pegar
enemy2, la copia se llamaenemy22, noenemy3. Si numeras los objetos, renombra la copia. Ver Objetos.
Comportamientos
- El quinto comportamiento de un objeto no se ve: funciona en el juego, pero no se puede editar ni quitar. Ponle a cada objeto cuatro como mucho; si ya tiene cinco, quita uno de los cuatro primeros y el quinto pasa a su tarjeta. Ver Comportamientos.
- Un Spawner con Every (s) a 0 crea copias en cada fotograma, hasta Max at once: las tarjetas no comprueban los mínimos ni los máximos de los ajustes. Dale un intervalo mayor que 0. Ver Comportamientos.
- Show a variable y Spawner siguen funcionando aunque escondas su objeto con el ojo: el texto se sigue escribiendo y el spawner sigue creando copias. Para quitarlos del juego, quita el comportamiento. Ver Comportamientos.
- Un Spawner sin zona suelta las copias donde estaba al cargar la sala, aunque se haya movido, y en una zona salen en su esquina de arriba a la izquierda. Dale una zona en Inside zone, o usa la acción Create from a template con at the subject. Ver Comportamientos.
- Con física, Follow / flee no para el objeto cuando su objetivo desaparece: sigue deslizándose. Apágalo cuando pase, con la acción Turn a behaviour on or off. Ver Comportamientos.
- El panel de problemas propone Dynamic «to also fall», y no cae: baja flotando, muy despacio. Usa Kinematic, o Dynamic con Gravity scale a 0. Ver Comportamientos.
- Show a variable en una plantilla no hace nada, y el panel de problemas no lo avisa. Ponlo en un objeto colocado en la sala. Ver Comportamientos.
- Los ajustes de lista admiten lo que escribas. Un valor que no está en la lista no da error: el juego usa el de serie, y en los de
trueofalse,false. Elige siempre de la lista. Ver Comportamientos.
Reglas y estados
- Change a variable con una variable
boolostring: usa soloset. Conadd, sumarfalseno apaga unbool, y con unstring,subtractymultiplyparan el juego. Ver Reglas y estados. - En States, + Action... o + Transition... justo después de escribir en una celda puede escribir un valor vacío en otra fila. Haz clic antes en la lista de estados y, después de añadir, repasa los valores. Ver Reglas y estados.
- Con física, las reglas pueden perder choques entre dos cuerpos que la física separa, como dos Dynamic: When two things touch y Touches a tag no los ven todos. Para los golpes entre cuerpos, usa
sprite.onCollisionen el código del objeto. Ver Reglas y estados. - Turn a behaviour on or off, al entrar en un estado, no apaga el comportamiento si nada más en la sala lo enciende o lo apaga. Hazlo con una regla: que la acción al entrar cambie una variable, y que una regla When a variable... apague el comportamiento. Ver Reglas y estados.
- Las etiquetas, siempre igual, y nunca en un marcador. El juego distingue
enemydeEnemy, y una regla When two things touch con un marcador no salta nunca, aunque el panel de problemas los dé por buenos. Para un marcador, usa When it enters a zone. Ver Reglas y estados. - Una máquina de estados en una forma o en un marcador no llega al juego, y el panel no lo avisa. Pon las máquinas en sprites o en imágenes. Ver Reglas y estados.
- Al panel de problemas le faltan avisos, y le sobran. No avisa de Take health away sobre un objeto sin Health, de Ask for another room hacia una sala que no existe ni de Create from a template con una plantilla cuyo sprite has borrado; y revisa también las reglas y los comportamientos apagados, que no se generan. Revisa esos casos tú. Ver Editor de escenas y Reglas y estados.
- Delete borra siempre una acción mientras la regla tenga alguna. Para borrar una regla, pulsa Delete una vez por cada acción y otra más para la regla. Ver Reglas y estados.
- En VALUES IN THIS STATE, los decimales van con punto: con coma, la celda vuelve a lo que tenía. Ver Reglas y estados.
- El panel de problemas nombra las reglas por su puesto («Rule 3»), y la lista WHEN no las numera. Cuéntalas desde arriba. Ver Reglas y estados.
- Si agrandas Room logic hacia abajo, una tabla de SETTINGS tapa a la otra. Hazla más baja hasta que se vean las dos. Ver Reglas y estados.
La sala y el juego
- Un
Game.jsonque no se puede leer (editado a mano, o con un conflicto de git) deja la pestaña Game en solo lectura, y el Build genera el juego sin sus controles ni sus variables, sin avisar. Si la pestaña diceRead only, arregla el fichero o recupéralo. Ver La sala y el juego. - La sala tiene dos nombres: el de su fichero
.scny el campo Name de Room, y cambiar uno no cambia el otro. Si renombras la sala, cambia los dos igual, y borra el.gen.arudel nombre viejo. Ver La sala y el juego. - Un nombre de variable que empieza por
_lo pierde en el código:_liveschoca conlives, y el código generado no compila. No empieces por_los nombres de las variables. Ver La sala y el juego. - Defaults no pregunta: cambia los controles por los cinco de serie y borra sus pines y sus botones del mando. Si lo pulsas sin querer,
Ctrl+Z. Ver La sala y el juego. - Cada clic en las flechas de Rate (fps) es un paso de deshacer. Escribe el número en el campo. Ver La sala y el juego.
El código que genera
- Generate .aru apagado en una sala que tu juego importa: el juego compila y se para al ejecutarse. Apágalo solo en las salas que el juego no importa. Ver El código que genera.
- En modo datos,
SceneUpdateyroom.nextScenepueden no existir, y el juego se para al llegar a esas líneas (Undefined variable). Quítalas de tu bucle mientras tus salas no tengan reglas, y si usas el mando I2C, llama aSceneInputRead()en cada fotograma. Ver El código que genera. - En modo datos, importa las salas con comillas dobles y con su extensión, como
import "Fase1.gen.aru": si no, el Build borra ese fichero y el juego no compila. Ver El código que genera. - Nombrar
SceneLoaden cualquier.arudel proyecto, aunque sea en un comentario, enciende el modo datos. Si no lo quieres, no escribas ese nombre. Ver El código que genera. - En modo datos, la música de Room › Music no suena:
SceneLoadsolo deja su ruta enroom.music. Ponla tú después de cargar la sala, conSound.loadMusic(room.music)ySound.playMusic(true). Ver El código que genera. - En modo datos, el primer Play de una sala que es solo datos, después de cambiar un recurso, puede fallar porque no encuentra su
.gen.aru. Pulsa Play otra vez. Ver El código que genera. - Si falla el Build de los recursos, el botón Compile del editor deja la barra de estado en «Compiling the game...». El error está en Output. Ver El código que genera.
Music Tracker
- La rejilla no lo comprueba todo. Los valores de los comandos, un ruido por encima de
N255o un Inst que no existe no se marcan, y paran la compilación entera. Pulsa Validate (F9) antes de compilar. Ver Music Tracker. - Sus % no va en porcentaje: va de 0 a 255, como Sus 0-255, y 128 es la mitad. Ver Music Tracker.
- Con REC, la rejilla salta a la fila
000mientras suena cada nota que grabas. La nota se escribe bien, en la fila del cursor. Ver Music Tracker. - Deshacer una nota escrita con el teclado pide dos
Ctrl+Z: el primero solo lleva el cursor a la nota. Ver Music Tracker.
Simulador GPIO
- Un CSV con decimales depende de Windows: las líneas que no entiende se saltan sin avisar. Escribe los decimales como tu Windows: con coma si Min y Max salen como
0,0y3,3. Ver Simulador GPIO. - El Phototransistor sale como digital en la tabla. El valor que lee el programa es el de la tarjeta. Ver Simulador GPIO.
- El botón del generador se queda en ■ Stop cuando un CSV acaba sin Loop. Un clic lo vuelve a poner en marcha. Ver Simulador GPIO.
Git
- Un fichero cambiado después de Stage solo sale en Staged, y el commit se lleva la versión que pasaste a Staged. Pulsa Stage All antes de Commit. Ver Git.
- Una dirección de remoto mal escrita se queda, y Remote Config ya no sale. Cámbiala desde una consola con
git remote set-url origin <dirección>. Ver Git. - El panel no se pone al día tras un merge o al borrar una rama del servidor. Pulsa el botón de refrescar. Ver Git.
- La casilla del mensaje no está vacía: «Briefly describe the changes made.» es texto, no una pista. Bórralo antes de escribir, o irá en el commit. Ver Git.
Drivers I2C
- El ejemplo del PCF8563, si ya tenías JARU instalado: tu copia del driver sigue guardando la hora en una variable
time, ytimees una función de JARU. Cámbiale el nombre. Ver Drivers I2C. - El
importdel ejemplo de la pestaña Code no es el del proyecto. Con los drivers de una carpeta de tipo, como los de fábrica de PMU, RTC y Audio, el programa no compila: «Imported file not found». Borra esa línea y deja la de Inser Driver. Ver Drivers I2C. - El BMP280 de fábrica es solo la plantilla: lee y escribe registros, pero no lee ni la presión ni la temperatura. Esas lecturas las tienes que escribir tú. Ver Drivers I2C.
- Import y Export no hacen nada: solo enseñan un mensaje. Copia a mano el
.arudel driver a la carpeta de la biblioteca, o desde ella, y pulsa Refresh. Ver Drivers I2C. - Chip Name se queda con la primera letra del nombre al escribir Driver Name. Corrígelo antes de pulsar Create o Generate with AI. Ver Drivers I2C.
- Los pines que pone la IA se pierden al volver a abrir el gestor, si la placa del proyecto no tiene bus I2C: la pestaña Code pone los pines 10 y 11. Pulsa Refresh. Ver Drivers I2C.
Ajustes
- Debug y el Play del editor de escenas no usan la configuración de Windows: arrancan la VM con el
boot.cfgque ya haya, el del último Run en Windows o el que hizo ESP32 Tools para una placa. Haz antes un Run en Windows. Ver Ajustes y avisos de actualización. - La VM de Windows no usa QoS, Retain ni los campos Will de MQTT: publica y se suscribe con QoS 0 y sin retener. Ver Ajustes y avisos de actualización.
Placas
ESP32 Tools: grabar y ejecutar
- Run pregunta casi siempre por cambios sin guardar («The ESP32 configuration has unsaved changes»): con Flash Size en Auto detect, el IDE escribe en él el tamaño que lee de la placa y no lo guarda. Contesta Yes: con No, el
boot.cfgsale de lo último que guardaste, y con Cancel, Run se para sin escribir nada en el Output. Ver Grabar el firmware y ejecutar. - Upload Program no aparta el monitor serie: si está abierto en ese puerto, no puede grabar. Les pasa lo mismo a Check Storage, Get Info, Generate y Get MAC. Ciérralo antes con Close Serial, o usa Run, que sí lo aparta. Ver Grabar el firmware y ejecutar.
- Application File vuelve al fichero principal: Run, Upload Program y Check Storage lo cambian antes de empezar, y la placa arranca siempre el programa principal. Para que arranque otro, hazlo principal en el proyecto. Ver Perfiles de placa.
Botones, pines y mando
- En el ESP32-S31, si el mando no contesta, el juego se queda sin entrada. Con el mando encendido y ningún control con GPIO, el juego no usa el teclado USB. Si juegas con el teclado, apaga el mando con Gamepad on, que pasa a Gamepad off. Ver Botones, pines y mando.
Pantalla, sonido, SD y red
- En las placas, MQTT no repite tus suscripciones al reconectar: cuando
MQTT.isConnect()vuelva a dartrue, suscríbete otra vez. Y Time Send, en ESP32 Tools, no hace nada. Ver Pantalla, sonido, SD y red. - En el ESP32-P4 y el ESP32-S31, IP Static no usa DNS 1 ni DNS 2. Si tu programa llama a un servidor por su nombre, deja IP Static apagado. Ver Pantalla, sonido, SD y red.
- Primary, en SD Card, no cambia nada en la placa: la unidad de serie es siempre
flash:. Ver Pantalla, sonido, SD y red.
Memoria y límites
readLine()no recibe nada en la placa: el monitor serie del IDE no envía lo que escribes, y el programa se queda esperando para siempre. Les pasa a los ejemplos que piden un dato, como CheckPrime, Factorial_ForLoop, FibonacciGenerator y Palindromes; pruébalos en Windows, donde funcionan. Ver Memoria y límites.
El lenguaje y el compilador
Sintaxis y operadores
- Indexar lo que devuelve una llamada no funciona:
f(x)[0]para el programa con «This object type is not indexable.», ymapa.keys()[0]cierra el compilador. Guarda antes el resultado en una variable. Ver Sintaxis básica. andyortienen la misma prioridad, y se calculan de izquierda a derecha:a or b and ces(a or b) and c. Cuando los mezcles, pon paréntesis. Ver Sintaxis básica.~con un decimal o un booleano da-1sin avisar. Usa los operadores bit a bit solo con enteros. Ver Operadores.
Funciones, clases y structs
- Una recursión de unas 80 llamadas cierra la VM sin ningún mensaje, y
tryno lo captura; cuantas más variables tiene la función, antes pasa. Escribe con un bucle las funciones que se llaman a sí mismas muchas veces. Ver Funciones. - Desde fuera de la clase,
remove,copy,clone,methods,properties,hasAttributeysetPropertyllaman a los de la VM, no a los métodos tuyos con ese nombre. Usa otros nombres. Ver Clases y objetos. - Asignar desde fuera una propiedad privada no da error:
c.saldo = 5crea otra propiedad, pública, con el mismo nombre, y los métodos de la clase siguen usando la privada. Cámbiala con un método de la clase. Ver Clases y objetos.
Listas, mapas y arrays
- Una lista o un mapa escrito de una vez que no cabe en la pila cierra la VM, sin ningún mensaje, también en las placas. En el programa principal caben 252 elementos de una lista o 127 pares de un mapa, y menos dentro de una función: si tu lista pasa de unos 200 elementos, móntala por trozos con
append(), o usa un array. Ver Listas, mapas y arrays. clone()de algo con un ciclo cierra la VM sin ningún mensaje: una lista que se tiene a sí misma dentro, dos mapas que se apuntan entre sí, un hijo que guarda a su padre. Con ciclos, usacopy()o copia a mano lo que necesites. Ver Listas, mapas y arrays.
Errores, ficheros y el compilador
- En el Output, el fichero de un error de sintaxis no va donde pone «Parser», sino detrás de «In file». Si no ves el fallo en la línea del error, mira la de antes. Ver Tu primer programa.
exitcon algo que no es un entero escribe un código sin sentido. Pásale un entero. Ver Errores y excepciones.
La API
Librería estándar
- En Windows,
time()con un código%que no existe cierra la VM sin ningún mensaje, comotime("%Q"). Usa los códigos de la tabla. Ver Librería estándar. vmerror()devuelve siempre0, aunque haya habido errores. Para las excepciones, usatryycatch; para los valores de error, mira lo que devuelve cada función. Ver Librería estándar.ink()ypaper()no cambian ningún color en la consola de Windows, ni dan error. Ver Librería estándar.
Display
- En Windows,
loadTFTno usaxniy: estira la imagen a toda la ventana. Para que se vea igual que en la placa, haz el marco del tamaño de la pantalla. Ver Display. - En Windows, el view no recorta hasta el primer
update(): lo que pintas fuera de él antes de ese momento se ve. Ver Display.
Draw
- En Windows,
line,circle,polygonygetPixelno cuentan desde el view: con un view más pequeño que la pantalla, salen desplazados. Sin view, o con un view del tamaño de la pantalla, no pasa. Ver Draw. - En Windows,
draw.bytesno usaxniy: estira la imagen a toda la ventana. En la placa se pinta en su sitio y a su tamaño. Ver Draw. draw.fontypolygonno responden igual a un error en Windows y en la placa. Una fuente que no existe lanza una excepción en Windows, y en la placa solo escribe el error en el monitor serie; unpolygonde menos de seis números devuelvetruesin pintar en Windows, y un valor de error en la placa. Usa fuentes de 0 a 8 y polígonos de tres vértices o más. Ver Draw.
Bitmap
Bitmap.newno hace nada en esta versión. Para hacer una imagen desde el programa, escríbela conwriteHeaderywriteLiney cárgala conload. Ver Bitmap.
Sprite
- Sin una escena con física,
onGround()no vuelve afalse: una vez quegrid.hitslo pone atrue, se queda así. Úsalo con un cuerpoDYNAMICde una escena con física. Ver Sprite. spingira de golpe tras una pausa, y el doble si pintas el sprite dos veces: el giro se aplica al pintarlo, con el tiempo que ha pasado. Pinta cada sprite una sola vez por fotograma; antes de una pausa larga, ponspin = 0y vuelve a ponerlo después. Ver Sprite.- Un collider de ancho, alto o radio 0 se ignora sin error: el sprite sigue con el de antes. Comprueba las medidas antes de asignarlas. Ver Sprite.
GridMap
path,dMapynearestconectan los dos ejes en cuanto uno tiene wrap. Si solo quieres un eje, cierra el otro con una fila o una columna de paredes. Ver GridMap.- En Windows,
draw.tilemapno ve lo que cambiacleary sigue pintando el mapa de antes. Después de unclear, haz unsetde cualquier celda, comomapa.set(0, 0, mapa.get(0, 0)). Ver GridMap. count,hasyfindno comprueban el valor: uno fuera de 0 a 255 da la vuelta en un byte, ycount(256)cuenta los 0. Pásales valores de 0 a 255. Ver GridMap.
Scene
- Quitar un sprite cambia el orden de dibujo: el último de la lista pasa a su hueco. Si un sprite tiene que verse siempre delante, no quites los otros: apágalos con
sprite.active = false. Ver Scene. - Un
stepRatede más de 4 veces los fotogramas por segundo va a cámara lenta: cadaupdate()hace como mucho 4 pasos. El editor de escenas deja poner hasta 240 en Step rate (Hz) y no lo avisa. Ver Scene. - Antes del primer
update(),draw.sceneno pinta los sprites que no están junto a la esquina (0, 0). Llama aupdate()antes de pintar la escena. Ver Scene.
Sound
setMusicVolume()antes deplayMusic()se pierde:playMusic()vuelve a poner el volumen de la canción. Llama asetMusicVolume()después deplayMusic(). Ver Sound.
Input
justPressed()yreleased()pueden perder pulsaciones si consultas las entradas varias veces en el mismo fotograma: cada lectura nueva borra el flanco de la anterior. LeeInput.pressed()una vez por fotograma y calcula los flancos a mano. Ver Input.
GPIO
- En el ESP32-P4 y el ESP32-S31, un pin en
GPIO.OUTPUTes solo de salida:GPIO.read()devuelve siempre0, yGPIO.onInterrupt()no salta con lo que escribes. Si necesitas saber cómo dejaste el pin, guárdalo en una variable. Ver GPIO. - En Windows,
resolution(bits)yfrequency(hz)sin pin danERR_INVALID_ARG_NUMBER. Pasa siempre el pin. Ver GPIO.
I2C
- En el ESP32 y el ESP32-S3, una escritura de más de 128 bytes se corta: no se manda lo que pasa de 128, sin aviso. Pártela en trozos. Ver I2C.
- En el ESP32 y el ESP32-S3, un segundo
initen el mismo puerto no cambia nada: deja los pines y la frecuencia de antes, y devuelvetrue. Para cambiarlos, llama antes aclose. Ver I2C.
LED
- Los colores y el brillo, en enteros. Un color decimal cuenta como 0, sin error; en HSV,
syvno se recortan fuera de 0 a 255; y en Windows,setBrightnesscon algo que no es un entero pone el brillo a 255. Pásalos como enteros, conint()odiv. Ver LED.
Power
- La Waveshare ESP32-S3-Touch-LCD-2.8 y la JaruCade se quedan sin USB tras el primer
Power.sleep(): el PC deja de verlas, y el IDE no puede grabarlas. No usesPower.sleep()en ellas; para recuperarlas, reinícialas con el botón BOOT pulsado y envíales otro programa con Run. Ver Power.
File
- En Windows,
seeksin laben el modo solo va a la posición 0: con otra, lanzaERR_INVALID_OPERATION. Abre el fichero con"rb"para ir a cualquier posición. Ver File.
Bytes
Bytes.newsin memoria para tantos bytes cierra la VM, ytryno lo evita. Comprueba el tamaño antes de crear el bloque. Ver Bytes.
JSON
JSON.stringifyredondea los decimales a 6 cifras significativas:1 / 3sale0.333333. Si necesitas más, escribe el número como cadena. Ver JSON.JSON.parselee algunos decimales con un error en la última cifra:JSON.parse("1.68") == 1.68esfalse. Para comparar decimales, mira si la diferencia es muy pequeña. Ver JSON.JSON.parse("null")lanzaERR_INVALID_VALUE: unnullsolo no se lee, aunque dentro de un objeto o de una lista llega comonil. Si el texto puede ser solonull, captura el error contry. Ver JSON.
Timer
- En Windows,
Timer.every(0)salta una sola vez. Usa un intervalo de 1 ms o más. Ver Timer.
Math
- Faltan
asin,acos,atan,atan2,expylog: de las funciones trigonométricas solo estánsin,cosytan, y no hay logaritmos ni exponencial. Ver Math.