Super Ultra Vector Library Experience Inspire Redux 2.0
Los Mojon Twins os presentamos, por obra de Vahka el creador, Vahka el destructor y Vahka el cansino, la segunda versión de nuestra biblioteca cutre de gráficos vectoriales para usar desde BASIC en cualquier ZX Spectrum.
La versión original, publicada hace unos años aquí, tenía un gran problema: el tamaño de las imagenes generadas con ella. Cada uno de los tres comandos posibles, PLOT, DRAW y FILL, ocupaban invariantemente 4 bytes. Además de mejorar un poco el editor de gráficos, hemos optimizado las rutinas de forma que ahora DRAW ocupa 2 bytes, PLOT 3 y FILL 4. Más abajo hay una descripción del binario generado.
Introducción
El paquete SUVLEIR 2 está formado por dos componentes: Draw 2.0, el editor de gráficos vectoriales, que funciona sobre plataformas PC/Windows, y gfxparser.bin, la rutina de dibujado para ZX Spectrum.
El tema se trata de hacer un dibujo en Draw 2.0. Al salir, el programa generará un archivo importme.bin con los comandos codificados en binario. Importando gfxparser.bin e importme.bin en tu emulador preferido podrás visualizar el dibujo desde BASIC de forma muy sencilla. Veámoslo paso por paso.
Calcando o dibujado de cero
Draw 2.0 necesita un archivo fondo.pcx de 256x192 píxels en el mismo directorio. En la distribución, ese archivo contiene una rejilla de 8x8, pero puedes poner cualquier dibujo o foto en él para "calcarlo" desde el programa con lineas.
Lo primero que haremos será iniciar el programa Draw 2.0. Si queremos calcar un dibujo, pulsaremos la tecla "D". Pulsándola de nuevo, el fondo desaparecerá.
El manejo es muy sencillo: Con el botón DERECHO del ratón hacemos PLOT, para definir el principio de una linea. Con el botón IZQUIERDO hacemos DRAW, para pintar una linea desde la posición actual hasta el final de la linea anterior o el último PLOT.
Para rellenar una zona, pulsaremos un número de 0 a 7, luego la tecla "F", y haremos click con el botón izquierdo sobre el área que queramos rellenar. En el editor se representará con un color sólido, pero en spectrum se rellenará de un patrón de tramado de motivo. El 0 es el más oscuro (negro) y el 7 el más claro (blanco). Importante: Los rellenos no se visualizarán correctamente si está activada la imagen de fondo. Recomendamos dejar el relleno para el final y hacerlo con la imagen de fondo realizada.
Si nos equivocamos, pulsando la tecla "U" desharemos el último paso. Podemos deshacer indefinidamente, hasta el principio del dibujo si hace falta, pero no podremos "rehacer", así que cuidado.
Cuando hayamos terminado nuestra obra maestra, pulsaremos "ESC". El programa finalizará grabando un archivo "importme.bin" en el mismo directorio en el que se encuentra.
Usando nuestro dibujo
Lo primero que tenemos que hacer es renombrar el archivo importme.bin, pues será sobreescrito la próxima vez que ejecutemos Draw 2.0. Le cambiamos el nombre, por ejemplo, a 001.bin.
Seguidamente, hacemos click con el botón derecho sobre 001.bin y seleccionamos Propiedades para ver cuánto ocupa, exactamente.
En nuestro ejemplo, la imagen dura 384 bytes, como se ve en la captura.
El módulo gfxparser.bin se carga en 63000, así que lo ideal es colocar los dibujos justamente debajo. Pillamos la calculadora y restamos 63000-384 = 62616. Apuntamos ese número, será la dirección de carga de nuestro 001.bin.
Si hacemos otro dibujo más, por ejemplo 002.bin que ocupa 403 bytes, restamos 62616-403 = 62213. Apuntamos ese número, que será la dirección de carga de 002.bin, y así sucesivamente.
Cargando todo en el emulador
Necesitamos un emulador que permita cargar binarios en una dirección de RAM. Spectaculator es perfectamente capaz, y puedes conseguir su última versión gratuita desde este enlace.
Primero de todo tenemos que proteger de BASIC el área de memoria superior donde vamos a poner los dibujos y gfxparser.bin. Miramos nuestra lista con las direcciones de inicio de cada dibujo para quedarnos con la dirección más baja. En nuestro ejemplo, sólo vamos a importar 001.bin, que se coloca en 62616 (como dijimos antes). Tomamos ese valor, le restamos 1 (obteniendo 62615), nos vamos a BASIC y hacemos un CLEAR a esta dirección:
$this->bbcode_second_pass_code('', 'CLEAR 62615')
Y pulsamos ENTER.
Seguidamente hay que importar gfxparser.bin. Abrimos spectaculator y arrastramos gfxparser.bin a su ventana. Se abrirá un diálogo preguntándonos dónde coloca este binario. Responderemos 63000.
Ahora importaremos todos nuestros dibujos. Arrastramos 001.bin a la ventana de spectaculator, y cuando nos pregunte la dirección introduciremos la que habíamos apuntado antes, 62616. Si tenemos más imagenes, repetiremos la operación introduciendo siempre la dirección correcta. Hay que ser muy cuidadosos con las direcciones.
Lo siguiente es crear una linea de BASIC que se encargará de llamar a gfxparser.bin tomando en la variable add la dirección del dibujo que vayamos a cargar. Colocamos esta linea en la 100, de esta forma:
$this->bbcode_second_pass_code('', '10 GOTO 1000
100 LET msb=INT (add/256): LET lsb=add-256*msb: POKE 63625,lsb: POKE 63626,msb: RANDOMIZE USR 63000: RETURN')
En la linea 1000 iría nuestro programa. Para mostrar 001.bin, sólo tendríamos que dar a la variable add la dirección de 001.bin (62616) y hacer un GOSUB a la linea 100:
$this->bbcode_second_pass_code('', '1000 LET add=62616: GO SUB 100: PAUSE 0')
Si hemos seguido todos los pasos, obtendremos nuestra imagen en pantalla:
Para grabarlo todo en cinta
Para grabar nuestro bloque de código y gráficos en cinta, ejecutamos esta orden en BASIC:
$this->bbcode_second_pass_code('', 'SAVE "stuff" CODE x, 64911-x')
Donde "x" es la dirección más baja de nuestros dibujos (en el ejemplo, que sólo teníamos 001.bin, sería 62616).
Y listo. Ante cualquier duda, preguntad aquí.
Formato del binario
No necesitas saber esto si no te interesa modificar la biblioteca.
El binario es un stream de bytes. La rutina actúa así:
1.- Leemos un byte 'c'.
2.1.- DRAW: Si c < 192, leemos un byte 'x', hacemos 'y = c', y dibujamos una linea desde la posición actual hasta (x, y). La posición actual pasa a ser (x, y).
2.2.- PLOT: Si c == 192, leemos un byte 'x', un byte 'y', y movemos la posición actual hasta (x, y).
2.3.- FILL: Si c == 193, leemos un byte 'x', un byte 'y' y un byte 'ex' y rellenamos en (x, y) con el patrón ex. La posición actual no se modifica.
2.4.- END: Si c == 255, hemos terminado.
3.- Volver a 1.
SUVLEIR 2.0
Moderador: na_th_an
SUVLEIR 2.0
- Adjuntos
-
Mojon-Twins--suvleir2.rar
- (333.48 KiB) Descargado 1033 veces
Como diría Rorshach: "Urm..."
Re: SUVLEIR 2.0
Moooola, cada día facilitando más a la gente la elaboración de las cosas. Ya es posible crear aventuras de texto con gráficos molones en poco tiempo.
Lo apunto para el próximo concurso de "elige tu propia aventura" como herramienta disponible.
Lo apunto para el próximo concurso de "elige tu propia aventura" como herramienta disponible.
Re: SUVLEIR 2.0
Posí. Yo lo he apañao porque lo necesito para restaurar juegos antiguos míos que usaban una rutina parecida pero que he perdido y nunca recordaré ni de dónde la saqué ni de cómo se llamaba... Así que me he hecho una yo ![Sonrisa :)](./images/smilies/icon_e_smile.gif)
![Sonrisa :)](./images/smilies/icon_e_smile.gif)
Como diría Rorshach: "Urm..."
Re: SUVLEIR 2.0
Siempre me ha parecido interesante esta utilidad. Es una forma sencilla de añadir gráficos a aventuras, ocupando poco espacio. Me imagino que si hay más concursos de aventuras (bien conversacionales, bien de seleccionar opciones) veremos cosas hechas con suvleir
De todas formas lo mejor es pintar la mona lisa en un Timex a base muchos ldirs guardando los atributos, no se si va por ahí la idea.....X-P
De todas formas lo mejor es pintar la mona lisa en un Timex a base muchos ldirs guardando los atributos, no se si va por ahí la idea.....X-P
Re: SUVLEIR 2.0
Me gustaría hacer una versión más compacta. Por un lado el archivo de datos se puede compactar aún más en algunas situaciones, y por otro lado si encontrase una rutina de relleno que hiciese lo mismo en menos bytes montaría todo en asm puro y ocuparía bastante menos.
Como diría Rorshach: "Urm..."
Re: SUVLEIR 2.0
Mi primera obra de arte vectorial:
![Image](http://www.bytemaniacos.com/varios/draw2/001.gif)
Por si queréis descargar la "fuente": http://www.bytemaniacos.com/varios/draw2/001.bin
211 bytes, no está mal. Concurso "Elige tu propia aventura" en ciernes...
Una sugerencia: ¿no es posible una versión que sólo use 1/3 de la pantalla? (el superior) es que para el concurso sería ideal de esa forma. Caben los textos y las opciones abajo.
![Image](http://www.bytemaniacos.com/varios/draw2/001.gif)
Por si queréis descargar la "fuente": http://www.bytemaniacos.com/varios/draw2/001.bin
211 bytes, no está mal. Concurso "Elige tu propia aventura" en ciernes...
Una sugerencia: ¿no es posible una versión que sólo use 1/3 de la pantalla? (el superior) es que para el concurso sería ideal de esa forma. Caben los textos y las opciones abajo.
Re: SUVLEIR 2.0
Jojo - me encanta ese dibujito, en serio, has logrado que entren ganas de colarse en la cueva ![Muy Feliz :D](./images/smilies/icon_e_biggrin.gif)
Sobre lo que dices de los 2/3, no es automático pero lo puedes hacer desde ya ayudándote de la imagen fondo.pcx. Copia el fondo.pcx que te subo a la carpeta donde está draw.exe. Cuando te vayas a poner a dibujar, dale a D para que se muestre fondo.pcx de fondo. Verás que arriba hay un rectángulo de 2/3 en blanco y abajo otro en rojo. Lo primero que tienes que hacer es dibujar una linea horizontal justo en el límite, y luego haces tu dibujo encima de la linea. La linea horizontal es para que no se "derramen" los fills luego.
![Muy Feliz :D](./images/smilies/icon_e_biggrin.gif)
Sobre lo que dices de los 2/3, no es automático pero lo puedes hacer desde ya ayudándote de la imagen fondo.pcx. Copia el fondo.pcx que te subo a la carpeta donde está draw.exe. Cuando te vayas a poner a dibujar, dale a D para que se muestre fondo.pcx de fondo. Verás que arriba hay un rectángulo de 2/3 en blanco y abajo otro en rojo. Lo primero que tienes que hacer es dibujar una linea horizontal justo en el límite, y luego haces tu dibujo encima de la linea. La linea horizontal es para que no se "derramen" los fills luego.
- Adjuntos
-
fondo.zip
- (2.76 KiB) Descargado 891 veces
Como diría Rorshach: "Urm..."
Re: SUVLEIR 2.0
Reservando 16K para gráficos vectoriales, con la complejidad que he mostrado, e incluyendo en ese espacio el propio generador, podemos tener más de 60 localidades con gráficos. Es decir, tenemos espacio de sobra para el programa en BASIC con los textos y las selecciones.
C O J O N U D O
Gracias Mojones, los concursos serán aún más divertidos ahora al facilitar a la peña el apartado gráfico.
PD: hay una forma que no se vea lo que se dibuja sobre la marcha, y es emplear tinta y papel del mismo color. Luego pasamos unas líneas de espacios encima con los colores correctos mediante merge y todo arreglado.
C O J O N U D O
Gracias Mojones, los concursos serán aún más divertidos ahora al facilitar a la peña el apartado gráfico.
PD: hay una forma que no se vea lo que se dibuja sobre la marcha, y es emplear tinta y papel del mismo color. Luego pasamos unas líneas de espacios encima con los colores correctos mediante merge y todo arreglado.
Re: SUVLEIR 2.0
Pues sí, es buena idea, pero a mí es que me gusta que se vea
Aunque no es mala idea dar esa opción de forma interna, para que el ocultado y desvelado de la imagen lo haga la propia biblioteca y no haya que programarlo. Me la apunto ![Muy Feliz :D](./images/smilies/icon_e_biggrin.gif)
![Sonrisa :)](./images/smilies/icon_e_smile.gif)
![Muy Feliz :D](./images/smilies/icon_e_biggrin.gif)
Como diría Rorshach: "Urm..."
Re: SUVLEIR 2.0
Bueno, pues es hora de plantearse un concursillo de "Elige tu propia aventura" que fomente esta herramienta.
¿Alguna fecha límite en concreto que nos venga a todos bien? es que no quiero que machaque el concurso BASIC, así que o damos un plazo corto (un mes) o que la fecha de entrega sea posterior al de BASIC.
¡Vamos! ![Cheerleader :cheer:](./images/smilies/cheer.gif)
¿Alguna fecha límite en concreto que nos venga a todos bien? es que no quiero que machaque el concurso BASIC, así que o damos un plazo corto (un mes) o que la fecha de entrega sea posterior al de BASIC.
![Cheerleader :cheer:](./images/smilies/cheer.gif)
![Cheerleader :cheer:](./images/smilies/cheer.gif)
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 102 invitados