Super Ultra Vector Library Experience Inspire Redux 1.0

Con este increíble nombre (a partir de ahora, y por economía de tipeo, SUVLEIR 1.0) empaqueto una colección de rutinas y utilidad pocha acompañante que servirán a todo el que tenga una mínima pericia para ilustrar sus programas (en BASIC, C o CM) con estupendos gráficos vectoriales rellenos con ocho tipos de patrones con tramados de semitono. Vamos, para que nos entendamos, para hacer gráficos del tipo de los que llevaban las aventuras conversacionales hechas con el PAWs, por ejemplo.

try3.png

El tema se compone de las rutinas propiamente dichas, y de un cutreprograma que nos ayudará a generar las imagenes vectoriales. Todo el conjunto es bastante fácil de manejar (por lo sencillo que es) y además de modificar para adaptarlo a vuestars necesidades (por ejemplo, si tenéis z88dk+splib2 instalado podéis recompilar el módulo modificando el código para que utilice otros patrones diferentes).

Sin más dilación pasamos a la acción😀

1. Módulo dibujador MDIB

Las imágenes vectoriales se almacenan como sencillas ristras de bloques o chunks de 4 bytes, cada una describiendo un comando de dibujo. Cada bloque se compone siempre por cuatro campos, cada uno ocupando 1 byte:

op      1 byte 
x       1 byte 
y       1 byte 
ex      1 byte

El byte op determina qué operación realizamos. Si op vale 0, la operación indicada será PLOT. Si vale 1, será DRAW y, si vale 2, será un FILL. Si op vale 3, habremos llegado al final del dibujo (EOD).

La operación PLOT pinta un punto en las coordenadas indicadas por x e y, trasladando en el acto la posición de dibujo a ese punto. La operación DRAW dibuja una linea desde la posición actual de dibujo hasta la indicada por x e y, trasladando a este punto la posición de dibujo también. Por último, la operación FILL realizará un relleno a partir de la posición indicada por x e y con el patrón indicado por el parámetro ex, de 0 a 7. Los patrones están ordenados de negro a blanco en 8 niveles de trama.

El módulo MDIB, que ha sido compilado para poder cargarse en la parte superior de la RAM dejando espacio para un juego de UDGs y otro de carácteres (en las posiciones 65368 y 64600, respectivamente), ubicándose a partir de 62000. Para usarla, sólo tenemos que tener en memoria una rista de datos describiendo un dibujo, pokear la dirección de esa ristra de datos en 62517/62518, y ejecutar la rutina (con un RANDOMIZE USR 62000, por ejemplo).

Por ejemplo, si tenemos nuestro dibujo en 50000, tendremos que pokear esta dirección en 62517/62518. 50000 es un valor de 16 bits, así que tendremos que separarlo en sus dos bytes (msb y lsb) y pokearlos en el orden correcto (lsb en 62517 y msb en 62518). Lo más cómodo para hacer esto desde BASIC es crearse una pequeña subrutina que reciba una dirección de memoria, la descomponga, la pokee, y luego llame al MDIB:

30 LET msb=INT(add/256): LET lsb=add-256*msb 31 POKE 62517,lsb: POKE 62518,msb 32 RANDOMIZE USR 62000: RETURN

Para llamar a nuestra subrutina para dibujar un diseño almacenado a partir de 50000 nos bastaría con un sencillo:

LET add=50000: GOSUB 30

Lo cual es bastante pochorro. Los dibujos ocupan bastante poco (el de arriba sólo ocupa alrededor de 1,200 bytes, lo cual está bastante bien), aunque podría mejorarse bastante empaquetando op y ex en el mismo byte, por ejemplo. Dejemos ese tipo de manejes para una versión posterior🙂

try302.png

¿Y cómo nos hacemos los diseños? Pues con CDRAW 1.0, del que os hablo a continuación😀

2. Diseñador de gráficos CDRAW 1.0

Para ayudaros con la tarea de crear diseños que puedan ser usados con MDIB, SUVLEIR v.1.0 incorpora un increíblemente cutre editor vectorial programado en 20 minutos y con menos detalles que las bragas de la princesa Letizia. Su manejo es un tanto tosco, pero nos sirve para lo que necesitamos. Lamentablemente, ni carga ni nada, por lo que los dibujos los tendremos que hacer de una vez. Conociendo la especificación, cualquiera que le guste hacer programas GUI bonitos y eficaces puede currarse un editor en 0.2 mucho mejor que este. A ver si alguien se anima😀

El editor funciona bajo entorno Windows (aunque te lo puedes compilar para Linux o lo que sea pues está hecho con Allegro e incluyo el código fuente). Al iniciarlo se nos muestra la pantalla vacía lista para ser “violeada” por nuestro ratón.

Pintando lineas

Con el botón izquierdo del mouse trazamos lineas. Hay que mirar el letrero de la parte superior de la pantalla: si pone MODO 0 estaremos en modo PLOT, con lo que el click hará que empecemos una nueva linea. Si pone MODO 1 estaremos en modo DRAW, con lo que el click hará que tracemos una linea desde el último punto. Pulsando el botón derecho del mouse pasaremos siempre al modo 0.

Haz una prueba: haz click en el centro de la pizarra. Verás como bajo el cursor aparece un punto. Si pulsas click de nuevo en otro lugar, se trazará una linea desde ese punto hasta el nuevo lugar donde hemos hecho click. Si vuelves a hacer click en otro sitio, se trazará una nueva linea desde el punto anterior a éste. Si pulsas el botón derecho, desactivarás el modo DRAW con lo que podremos empezar a dibujar en otra parte.

draw.png

Rellenando

Seleccionaremos qué patrón queremos usar pulsando una tecla del 0 al 7. Como soy un cutre, he representado cada patrón por un color. Verás que hay un letrero en la parte superior que cambia de color dependiendo de qué patrón elijamos.

Para rellenar un área, pulsaremos F y luego haremos click donde queramos rellenar. Así de fácil.

Guías

Para facilitarnos el trazado de dibujos, podemos emplear una imagen de fondo. Este sistema también es muy cutre😀 El programa cogerá automáticamente al iniciar una imagen de 256x192 situada en su mismo directorio que se llame FONDO.PCX. Si quieres usar una imagen para trazar arriba, redúcela a 256x192, y grábala en formato PCX. Cualquier programa de diseño que se precie exporta en ese formato. Si el tuyo no se precia, puedes convertir cualquier formato a PCX usando, por ejemplo, Irfanview.

En el editor, pulsando D veremos la imagen, y pulsando D de nuevo la ocultaremos. Te recomendamos que sólo la dejes de fondo para trazar, ya que los rellenos no funcionan con la imagen activada (si piensas un poco y tienes en cuenta que el programa es tela de cutre, seguro que averiguas por qué ocurre esto :D).

Deshacer

Si te equivocas, pulsando U vuelves al paso anterior. Se puede deshacer infinitamente, hasta el principio. Pero ojo con las emociones, no se puede rehacer.

Salvando

Para salvar sólo hay que salir del programa pulsando ESC. A la salida, el programa genera un importme.bin que contiene nuestro dibujo. Recomendamos encarecidamente renombrar este archivo de inmediato, ya que cualquier ejecución del programa lo sobrescribiría.

Usando los diseños

Pues sencillo, siguiendo estos pasos:

1.- Necesitamos un emu que permita cargar bloques binarios en RAM del tirón. Por ejemplo, Spectaculator. Un, dos, tres, responda otra vez. Spectaculator.

2.- Haces un CLEAR en la dirección más baja donde vayas a empezar a poner dibujos. Por ejemplo, si vas a cargar dibujos a partir de 50000 hacemos un CLEAR 49999. Esto mueve la pila de BASIC y sus camuñas bajo 50000 para que no nos molesten.

3.- Importas el archivo gfxparser.bin en la posición de memoria 62000.

4.- Importas tu dibujo en la posición que sea (por ejemplo, 50000).

Y listo. Tecleando la subrutina de más arriba e invocándola podrás ver cómo el dibujo aparece en pantalla.

Es util ir apuntando cuando ocupa cada binario con cada dibujo, con el fin de irlos apilando en RAM. Por ejemplo, si cargas uno que ocupe 600 bytes en 50000, el siguiente lo cargaremos en 50600 y así sucesivamente. Trabajando con BASIC es más interesante empezar desde arriba e ir bajando. Sabemos que MDIB está en 62000, así que si tu primer dibujo ocupa 600 bytes es buena idea ponerlo en 62000600 = 61400. El siguiente irá debajo, y así sucesivamente. Como mejor te venga.

eolaestz3.jpg

Los tiestos

Aquí está el paquete con todo, que contiene, a saber:

  • Carpeta src: Contiene el código fuente de CDRAW y de MDIB.
  • draw.exe: Ejecutable de CDRAW.
  • alleg42.dll: Necesaria para ejecutar CDRAW en Windows.
  • fondo.pcx: Archivo con el fondo para activar usando D en CDRAW.
  • gfxparser.bin: El módulo MDIB para importar en la dirección 62000.
  • castillito.bin: Un diseño para que probéis el sistema.
  • try3.szx: Snapshot con gfxparser.bin y castillito.bin cargados y la subrutina tecleada, para que veáis como queda.

Y con esto y un bizcocho, me quedo esperando el aluvión de dudas existenciales. Porque espero que esto sea de utilidad para alguien. Al menos lo veo yo más molón que el viejo blockygraphs, ¿verdad?😉

Por cierto, very special thanks to Alvin Albrecht (once again) for his unvaluable help during the developing of this little project! Ea.

10 Responses to Super Ultra Vector Library Experience Inspire Redux 1.0

  1. anjuel dice:

    Eres la puta biblia de esto.
    Genial tío, ahora a hacer juegos chorrones!
    Yo quiero uno sobre Naranjito, el mondarino cabezón y furgolista!😆

  2. na_th_an dice:

    Yo quiero hacer uno con AES330 como protagonista😀

  3. anjuel dice:

    Tu aplicación dibuja círcunferencias grandes?😆😆

  4. na_th_an dice:

    Eso lo dejamos para la versión 2.0😆

  5. cht666cht dice:

    tiene muy buena pinta la biblioteca, a ver si alguien se anima a hacer algo guapo con ella. ¿Porqué sale una chinita macizorra por ahi en medio?

  6. AugustoRuiz dice:

    Una sugerencia para la versión 2.0: La posibilidad de cargar una imagen y que salga en el fondo. Así puedes “calcar” la imagen😉

  7. na_th_an dice:

    cht666cht, la chinita es porque había mucho texto seguido y quedaba mu triste. Como no tenía nada más acorde con el artículo, al menos puse algo “bonito”😀

    Agus, eso ya se puede hacer😀 Mira la sección Guías del manual🙂

  8. cht666cht dice:

    En realidad la pregunta era… porqué sale SÓLO una chinita macizorra? pon mas!😀

  9. sromero dice:

    Me encanta, na_th_an.

    Yo creo que si pules algunos detalles un poco más (lo que te comentan en el foro de Speccy.org) puede quedar algo muy muy muy bueno.

    A mí me ha gustado mucho la idea🙂

  10. Mariano dice:

    Pregunta, en una Zx Spectrum 48k cuantas imágenes de estas podríamos cargar, y desde que sector de memoria deberíamos empezar para cargar por ejemplo unas 5 si fuese posible?.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: