Autor Tema: Mapas en c64 con scroll  (Leído 2250 veces)

Zub

Re:Mapas en c64 con scroll
« Respuesta #15 en: Mayo 04, 2017, 19:29:40 »
Um, en esto no consigo seguirte sigo.Si el mapa lo almacenas como una lista de tiles, la x-y de mapa, lo que me da es 1 tile.Eso no me da las filas visibles.Y, en cada fila, hay varios tiles.
La x-y te da la posición del primer tile visible de la pantalla (arriba a la izquierda):

- Co mapy sabes qué fila es la primera que se pinta.
-  Como tienes la lista de punteros de cada fila, accediendo a fila[mapx] te da el primer tile. El siguiente de la fila sería fila[mapx+1], etc. Así hasta fila[mapx+39]. Luego pasas al siguiente puntero de la lista.

Ah, no había pensado en hacer shifting así...Pero, en el peor de los casos (scroll en diagonal, hay que hacer shift tanto de 1 fila, como de 1 columna.Dependiendo de cómo lo hagas, hay que mover 4+4 o 4+3 posiciones de cada 16 (en tiles 4x4), lo cual es más o menos la mitad.
Que está muy bien, pero, el "overhead" de codigo para hacerlo asi, es mucho?

Si haces scroll diagonal, primero haces un shift en horizontal y luego vertical en el mismo frame. REutiliza el código, como si fueran dos scrolls secuenciales.

Si tienes curiosidad mírate la rutina "scrollwork" del juego BOHF, con un poco de paciencia se entiende fácil.
 

Zub

Re:Mapas en c64 con scroll
« Respuesta #16 en: Mayo 04, 2017, 19:30:54 »
mapx y mapy sirven para ubicar la "ventana visible" del mapa. Te dan la posición del primer tile visible de la pantalla (arriba a la izquierda). El mapa es un rectángulo de tiles, 1 byte por tile.

- Co mapy sabes qué fila es la primera que se pinta.
-  Como tienes la lista de punteros de cada fila, accediendo a fila[mapx] te da el primer tile. El siguiente de la fila sería fila[mapx+1], etc. Así hasta fila[mapx+39]. Luego pasas al siguiente puntero de la lista.

Si haces scroll diagonal, primero haces un shift en horizontal y luego vertical en el mismo frame. REutiliza el código, como si fueran dos scrolls secuenciales.

Si tienes curiosidad mírate la rutina "scrollwork" del juego BOHF, con un poco de paciencia se entiende fácil.
« última modificación: Mayo 04, 2017, 19:32:37 por Zub »
 

Dashiad

Re:Mapas en c64 con scroll
« Respuesta #17 en: Abril 05, 2018, 18:37:20 »
Después de tenerlo aparcado, he retomado el proyecto del mapa...
Con el código que tengo ahora, con tiles de 4x4, y con "color por cada caracter", pintando 20 filas (dejando 5 para marcador,etc), el repintado de memoria de caracteres + memoria de color requiere unos 16800 ciclos, según el debugger del C64Prg studio.
Este repintado es decodificando mapa/tile para toda  la pantalla (no haciendo desplazamento dentro de la memoria de video o de color).
Teóricamente, un repintado completo de ambas memorias, completamente "desenrollado", y sin ningún otro cálculo, serían 1000 LDA / STA para caracteres, y otros tantos para color. A 4 ciclos por cada uno, serían 16000 ciclos en total para toda la pantalla, o 12800 para 20 lineas.

Pero, para bajar el número de ciclos todo lo posible, he añadido una restricción, que es: el color del caracter corresponde a los 3 bits bajos de su código de caracter.Asi, lo que se escribe en la memoria de caracteres y en la memoria de color, es exactamente lo mismo (se hace 1 LDA, y 2 STA).
Esto significa que hay 32 caracteres cuyo color es negro, otros 32 con color blanco, etc.
Y esto lleva a que al crear los tiles/mapas, hay que elegir con cuidado qué caracteres usar..

He visto que charpad tiene un sistema de "atributos de caracter", pero, si no me equivoco, se basa en un set de datos aparte, no en el propio valor de los caracteres (por ejemplo, usar el bit más significativo para diferenciar caracteres "atravesables" de los que no, etc).

Conocéis algún software de mapas donde se puedan hacer "grupos" de caracteres basado en una máscara de bits?
 

Dashiad

Re:Mapas en c64 con scroll
« Respuesta #18 en: Septiembre 16, 2018, 23:04:52 »
Pues aqui está, al fin, la primera implementación del pintado de mapas, y, por ahora, consigo dibujar tanto la memoria de video como la de color en menos de un frame, usando tiles de 4x4 y color por caracter (no por bloque).
Hay 1 restricción: el color del caracter viene dado por su código de caracter. Es decir, al dibujar el caracter "1", ese "1" va a la memoria de video y a la de color. Es decir, la letra "A" siempre sería blanca.
El algoritmo no está basado en mover la memoria de video  (o de color ) sobre sí misma, sino en la coordenada de mapa.En cada frame se calculan los tiles visibles, y se copia de la memoria de tiles, sin doble bufer.
Por ahora dejo un par de prg, ( necesitan ser arrancados con SYS 8192 ), uno de ellos repinta sólo la memoria de video, y el otro repinta también la de color.
El scroll funciona con el joystick, y por ahora no usa el scroll hardware.Es un mapa de 40x40 tiles de 4x4.

Aún queda bastante por optimizar, para hacer que con sprites en pantalla, y con las interrupciones necesarias para reutilización de sprites, el tiempo de pintado se mantenga por debajo del frame.

El fondo blanco se activa para visualizar la duración del pintado.
 
« última modificación: Septiembre 16, 2018, 23:06:25 por Dashiad »
 

josepzin

Re:Mapas en c64 con scroll
« Respuesta #19 en: Septiembre 17, 2018, 21:27:51 »
Muy bueno, los he probado! a ver que tal te va con el scroll fino, debería ser muy simple agregarselo.