Paso a explicar como realizar el volcado de imágenes en pantalla (modo 4) y concretamente, en este caso con el dragón pequeño:
Pasos a seguir:
1.- Crear el diseño con las medidas y la posición del dibujo adecuadas.
2.- Usar programa para convertir el área de memoria de pantalla correspondiente a fichero secuencial.
3.- usar procedimiento para volcar el fichero secuencial con la imagen en la posición de pantalla adecuada.
Paso 1
Creamos el diseño del dragón que ocupará 96x48 pixels con cualquier programa de dibujo para QL o convirtiendolo desde PC y lo colocamos en la posición superior izquierda de la imagen por comodidad. dicha imagen ocupará toda la pantalla o al menos todo el ancho de la pantalla.
y lo guardamos.
Paso 2
Mediante el programa guardar_bas volcamos el dragón en pantalla y copiamos línea a línea el dibujo a un fichero externo.
Código: Seleccionar todo
100 REMark guarda en modo 4
110 fichero$ = "dragon"
120 LBYTES fichero$ & "_scr", 131072
130 pos = 131072
140 ancho = 96 : alto = 48
150 ancho = ancho / 4
160 reserva = ancho * alto
170 salto = 128 : incremento = 0 : suma = 0
180 mem = RESPR(reserva)
190 FOR bu = 0 TO alto - 1
200 FOR i = 0 TO ancho - 4 STEP 4
210 despla = incremento + i
220 POKE_L mem + suma, PEEK_L(pos + despla)
230 suma = suma + 4
240 END FOR i
250 incremento = incremento + salto
260 END FOR bu
270 SBYTES fichero$ & "_spr", mem, reserva
El ancho en pixels de la imagen ha de ser múltiplo de 16.
El programa carga la imagen del dragón y la vuelca linea a linea, secuencialmente, a una zona de memoria que luego guarda en el fichero dragon_spr con SBYTES.
Paso 3
Una vez guardado, sólo tenemos que crear un procedure para colocar la imagen en la posición de pantalla deseada.
Código: Seleccionar todo
100 dragon = RESPR(1152)
110 LBYTES dragon_spr, dragon
120 :
130 volcar dragon, 96, 48, 32, 20
140 :
150 DEFine PROCedure volcar(mem, ancho, alto, pos_x, pos_y)
160 REMark procedure para modo 4
170 REMark pos_x debe ser multiplo de 16
180 LOCal pantalla, salto, bu, incremento, suma, despla, pos, i
190 pantalla = 131072 : ancho = ancho / 4
200 salto = 128 : incremento = 0 : suma = 0
210 pos = ((pos_x / 4) + pantalla) + (pos_y * salto)
220 FOR bu = 0 TO alto - 1
230 FOR i = 0 TO ancho - 4 STEP 4
240 despla = incremento + i
250 POKE_L pos + despla, PEEK_L(mem + suma)
260 suma = suma + 4
270 END FOR i
280 incremento = incremento + salto
290 END FOR bu
300 END DEFine volcar
El procedure volcar sólo sirve en principio para modo 4, y el valor de pos_x ha de ser múltiplo de 16 forzosamente.
El procedure lo que hace es invertir el proceso del programa anterior. Lee los datos secuenciales que cargó a una zona de memoria y los vuelca en pantalla línea a linea.
Los parámetros de volcar son:
mem = indica la posición de memoria donde se guarda la imagen
ancho = indica la anchura en pixels de la imagen (múltiplo de 16)
alto = indica la altura en pixels de la imagen
pos_x = indica la coordenada x de la pantalla donde se visualizará la imagen (desde 0 a 511-ancho en valores múltiplos de 16)
pos_y = indica la coordenada y de la pantalla donde se visualizará la imagen (desde 0 a 255-alto)
Aquí los ficheros dragon_scr y dragon_spr en un
fichero zip para probar ambos programas.
El volcado se hace mediante palabras largas, es decir, de 32 en 32 bits para aligerar la representación en pantalla. Si queremos que la imagen se posicione en una coordenada X que no sea multiplo de 16 podemos recurrir al siguiente truco o emplear un código que mueva palabras o bytes en vez de palabras largas:
Truco cutre pero efectivo:
Creamos una ventana que ocupe al menos lo mismo de alto que la imagen y de ancho el ancho de la imagen mas la suma de los pixels que queremos mover dicha imagen a derecha o a izquierda. La ventana estará justo debajo de la imagen.
Volcamos entonces la imagen a la pantalla en una posición x múltiplo de 16 como se indicó alineada a derecha o izquierda en la ventana.
Una vez volcada la imagen usamos el comando PAN (desplazamiento PANorámico de la ventana) X pixels (positivos o negativos) y tendremos la imagen en la posición deseada.
Sobre el método...
Para realizar todo esto, en primer lugar pensé en usar DATAs, evitando tener que crear un fichero externo como en el caso propuesto, pero topé de frente con el sistema de conversión de números del SuperBASIC. Cuando los números son demasiado grandes, el QL emplea redondeo y notación científica para escribirlos, así pues esos datos que volcaba a los DATAs luego al ser leídos y mostrados por pantalla no reproducían la misma imagen. En fin, peculiaridades del SuperBASIC.
Lo único que solucionó el problema es usar la sentencia PEEK dentro de la misma instrucción P0KE, y de esta forma los datos almacenados si son exactamente los mismos que los que se leyeron por pantalla.
Bueno, esto es todo por ahora.
Las dudas ya sabéis, no dejéis de preguntarlas.
P.S. Vuelvo a estar sin correo. Para contactar usa la otra cuenta. Te he enviado un par de mails.