Skip to content

v0.1.1

Latest

Choose a tag to compare

@github-actions github-actions released this 10 Oct 22:02
39a4c9a

Cambios que pueden afectar a tus programas

  • Las listas se comparten por completo, como los mapas: asignar una lista a otra variable, guardarla en un campo o pasarla a una función comparte sus elementos y su longitud. agregar, insertar y eliminar dentro de una función cambian la lista de quien la llamó; antes ese cambio no se veía fuera. Para tener una lista independiente se usa copiar().
  • Un rango ya no cuenta hacia atrás por su cuenta: repetir (a..b) solo cuenta hacia adelante y no da ninguna vuelta si a no es menor que b, así que repetir (0..lista.longitud() - 1) no entra al cuerpo con una lista vacía. Para bajar se escribe el paso: repetir (5..0, paso = -1). Los límites literales escritos al revés sin paso dan un error que lo sugiere.

Lenguaje

  • repetir (n): con un entero da n vueltas contadas desde 0, sin necesidad de escribir un rango.
  • repetir (a..b, paso = n): cuenta a saltos (paso = 2) o hacia atrás (paso = -1). Un paso 0 es un error.
  • repetir sobre una cadena: la recorre letra por letra.
  • Comparar con == opcionales, resultados y constantes: si buscado == .Ninguno, si elegido == .Alguno("Ana"), si guardar() != .Ok y si tecla == .Espacio compilan sin casos. Las constantes de la biblioteca también pueden escribirse con su tipo (retro.Icono.Arriba).
  • Números en hexadecimal y binario: 0xFF y 0b1010.
  • Métodos sobre un número escrito: 7.formato(2).
  • Interpolar cualquier valor: las listas, los mapas, las estructuras, los enums, los opcionales y los resultados se pueden poner en "${...}" y pasar a cadena(), con el mismo formato que imprimir.
  • si de una línea: una rama puede empezar por -, . o (, como en un valor negativo o una .Variante.
  • Una función con resultado puede terminar en un repetir infinito sin romper.

Biblioteca

  • Listas: ordenar(descendente = falso) ordena una lista de entero, decimal o cadena, y ordenar_por(claves, descendente = falso) ordena cualquier lista según una lista paralela de claves. Las dos son estables.
  • Cadenas: rellenar_izquierda(ancho, relleno), rellenar_derecha(ancho, relleno) y repetir(veces). Un marcador con ceros es cadena(puntos).rellenar_izquierda(7, "0").
  • std/mate: operaciones de bits con bit_y, bit_o, bit_xor, bit_no, desplazar_izquierda y desplazar_derecha.
  • Sonidos sin archivos: audio.tono y audio.ruido crean un sonido en memoria, y audio.reproducir acepta un parámetro tono que cambia la altura y la velocidad.
  • Colores: color.mezclar, Color.con_alfa, los canales de lectura r, g, b y a, y color.a_entero/color.desde_entero para el formato 0xRRGGBB de las rejillas.
  • tiempo.ahora(): los segundos transcurridos desde que empezó el programa, también en programas de consola.
  • Rejilla.buscar(valor): las celdas que contienen un valor, para leer de una capa dónde empieza el jugador o dónde están las llaves.
  • retro: más de 40 iconos nuevos (Cara, Oro, Casa, Castillo, Gato, Manzana…), y retro.icono y retro.glifo aceptan voltear_h y voltear_v.

Pintar en una imagen

  • con graficos.pintar_en(imagen): lo que se dibuja dentro del bloque va a la imagen en vez de a la pantalla, sin cámara ni recorte, y al salir todo vuelve a como estaba. Sirve para minimapas, escenas a baja resolución que luego se amplían o fondos que se pintan una sola vez; el bloque puede usarse en cualquier momento, no solo desde pintar. Las funciones de lienzo ven lo pintado.
  • graficos.recortar con con: con graficos.recortar(rect) quita el recorte al salir del bloque; los bloques anidados se limitan al que los contiene.
  • graficos.liberar(imagen): libera en el momento la copia de una imagen en la tarjeta gráfica; la imagen sigue siendo válida y vuelve a subirse al dibujarla.

Entrada simulada

  • Pruebas: std/pruebas puede simular la entrada: pruebas.mantener, soltar y pulsar (teclas), sus variantes _raton y _mando, pruebas.raton(x, y), pruebas.rueda(x, y), pruebas.texto("...") y pruebas.eje_mando(eje, valor). Un ejercicio como «al pulsar D el jugador se mueve» ya se comprueba a través de entrada.
  • cometa captura --entrada: el guion admite texto "hola", rueda x y, botones del mando 0 (+MandoA) y palancas (eje IzquierdoX 1), y std/pincel/ui recibe el texto escrito.

Editor de mapas

  • cometa mapa: abre un editor de mapas de tiles en el navegador (tools/mapa-editor, un solo archivo HTML), con el atlas dungeon como paleta, un color por celda, capas, pintar, borrar, rellenar y rectángulo. Guarda y abre archivos .mapa.txt y exporta un módulo .cometa con los iconos y los colores de cada capa.
  • rejilla.dibujar(..., colores = otra_rejilla): una rejilla de colores (0xRRGGBB por celda) pinta cada celda de su color; sin ella se usa tinte, como antes.
  • retro.cargar_mapa(ruta) y retro.mapa(mapa): cargan un .mapa.txt y lo dibujan como se ve en el editor. mapa.capa("suelo") da la rejilla de una capa para consultar celdas, colisionar o cambiar el mapa mientras se juega.
  • Marcas con nombre: la herramienta Marca del editor le pone un nombre a una celda (jugador, enemigo, puerta) sin dibujar nada en ella, y mapa.marcas("enemigo") devuelve la columna y la fila de cada celda con ese nombre. Ya no hace falta reservar un icono por cada cosa que el juego coloca. En el .mapa.txt son líneas @ nombre columna,fila.
  • retro.hoja(atlas = .Dungeon): el atlas retro como graficos.Hoja, para dibujar una rejilla con los iconos dungeon: rejilla.dibujar(mapa, retro.hoja(), tinte = .Gris).
  • rejilla.desde_csv(texto, capa = ""): crea una rejilla a partir del texto de un .mapa.txt (una fila por línea, valores separados por comas en decimal o 0x…, # nombre antes de cada capa).
  • recursos.texto(ruta): incorpora un archivo de texto al programa, como recursos.imagen hace con las imágenes.

Correcciones

  • Nombres que solo cambian en la mayúscula inicial: una función punto y un tipo Punto ya pueden convivir (antes daban «error interno del compilador»). Dos campos, métodos o tipos que solo se distinguen así dan un error claro. Las variables llamadas como algo de Go (len, string, copy, fmt…) ya no rompen el programa.
  • "${ valor }": una interpolación puede llevar espacios alrededor de la expresión; antes daba un error de indentación.
  • Rutas en Windows: los errores, los fallos en ejecución y «ir a la definición» muestran los archivos con sus mayúsculas, no la ruta entera en minúsculas.
  • Editor más ágil en juegos con recursos: el editor ya no vuelve a leer y decodificar cada imagen y sonido con cada tecla; solo cuando el archivo cambia.
  • Go instalado dos veces: si el primer go del PATH no funciona, Cometa prueba el siguiente en vez de fallar, y usa el del PATH antes que el de la carpeta del instalador.
  • mientras con una condición que no es bool: el error habla de la condición y no de un operador ! que no está escrito.
  • Un dígito de otro alfabeto (٣) en un número da un error que lo explica.
  • La pista de @ llega a todos los programas: escribir vida en vez de @vida dentro de un método explica que falta la @ también en los programas que usan usar (antes solo en los que no importaban nada), y con campos de tipos embebidos.
  • Autocompletado de .Variante en cualquier archivo: las etiquetas de casos, los opcionales y los resultados (.Alguno, .Ok…) se completan también en los archivos con usar, que antes se quedaban sin esas sugerencias.
  • Errores de nombres repetidos más claros: dicen si el nombre ya era una función, un tipo o una global.
  • Errores de ejecución con columna: un índice fuera de la lista o una división entre cero muestran la línea y señalan la expresión con ^.
  • Por qué un tipo no cumple una interfaz: el error dice el primer motivo: el método que falta, el resultado o los parámetros que no coinciden, o el método o el tipo embebido sin pub.
  • usar que no encuentra su archivo: el mensaje está en español y nombra el archivo como se escribió y el módulo que lo importa.
  • Función que no produce su resultado: el error señala el tipo de resultado declarado y no la última sentencia.
  • |variable| en una rama de casos: el error explica dónde va cuando se escribe en el lugar equivocado.
  • Estructuras omitidas: un campo de estructura que no se escribe ya no exige inicializar los campos enum o de resultado de dentro cuando su tipo les da un valor predeterminado.
  • Miembros sobre un literal de estructura: leer un campo o llamar a un método directamente sobre un literal ya compila.
  • ! en la cabecera de una función: en fn f() bool !@g() el ! separado se lee como negación, no como tipo de resultado.
  • Mayúsculas acentuadas en retro.texto: Á, Í, Ó y Ú, que la fuente no tiene, se dibujan con la letra sin tilde.
  • imprimir ya no falla con una estructura sin campos.

Herramientas

  • cometa compilar es más rápido en programas de consola (de alrededor de 1 s a 0,2 s) y ya no necesita tener Go instalado: el Go generado deja de comprobarse en cada compilación; esa comprobación corre ahora en las pruebas del compilador.
  • El editor analiza menos: los errores se recalculan cuando dejas de escribir un instante, no con cada tecla, y pasar el ratón o ir a una definición reutiliza el último análisis.
  • El Go de los programas más simples sale ahora por el mismo camino que el de los demás, con una variable temporal por operando (más largo, mismo resultado).
  • Constantes de un tipo en el editor: al pasar el ratón por color.Color, entrada.Tecla y los demás tipos con constantes se ven sus valores (.Rojo, .Espacio…). En retro aparecían bajo el tipo siguiente.
  • «Ir a la definición» en la biblioteca: mate.angulo, mate.interpolar y los métodos entrar/salir de graficos.Recorte llevan a su propia línea y no a otra declaración con el mismo nombre.
  • La referencia de graficos.Camara2D muestra que zoom vale 1 si no se indica.
  • cometa captura y cometa probar no tocan tus partidas guardadas: std/pincel/datos usa una carpeta temporal vacía en las dos órdenes; --datos carpeta parte de un guardado concreto y conserva lo que se escriba.