Ejemplo de Tilemap con BitArrays en CPCtelera

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Ejemplo de Tilemap con BitArrays en CPCtelera

Mensajepor ronaldo » Dom 06 Mar , 2016 9:54 pm

Tras haber visto que muchos usuarios lo indicaban, estoy trabajando en mejores ejemplos de uso de los bitarrays en CPCtelera (Arrays de tipos de datos inferiores al byte).

Para empezar, he creado un ejemplo de cómo definir un Tilemap completo usando 1-bit por tile y modificarlo en ejecución (con un minieditor). Tenéis todo el código del ejemplo en Github. La parte más interesante es el fichero map.c, donde se ve cómo definir manualmente el bitarray y modificarlo en ejecución. Aquí os dejo un vídeo y el dsk por si queréis probarlo.

Podríais decirme si el código os parece entendible? Quiero crear más ejemplos, pero necesito saber qué dudas generan y si se entienden bien o no.


En CPCtelera tenéis disponibles funciones para manejar arrays de bits, de 2 bits, de 4 bits y de 6 bits (este último añadido recientemente).
bitArrayTileMap.zip
(3.38 KiB) Descargado 47 veces

Avatar de Usuario
AmstradGamer
Forero habitual
Forero habitual
Mensajes: 189
Registrado: Dom 08 Jun , 2014 10:08 am

Re: Ejemplo de Tilemap con BitArrays en CPCtelera

Mensajepor AmstradGamer » Mar 08 Mar , 2016 1:08 pm

Para mi es difícil saber si lo entiendo del todo bien sin meterme a pelearme de verdad con el código, pero a priori, parece que se entiende.

Parece interesante utilizar bits en lugar de u8s para definir mapas de tiles, siempre y cuando tengas menos de 256 tiles diferentes (que son muchos), para ahorrar espacio en la definición de los mismos.

Gracias por los ejemplos, son muy útiles.

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: Ejemplo de Tilemap con BitArrays en CPCtelera

Mensajepor ronaldo » Mié 09 Mar , 2016 2:01 pm

No hay de qué, para eso estamos :).

Si en algún momento tienes un rato para revisar el código en más detalle y tienes dudas, pregúntame. Las dudas es justo lo que necesito saber para mejorar los ejemplos.

Avatar de Usuario
AmstradGamer
Forero habitual
Forero habitual
Mensajes: 189
Registrado: Dom 08 Jun , 2014 10:08 am

Re: Ejemplo de Tilemap con BitArrays en CPCtelera

Mensajepor AmstradGamer » Jue 07 Abr , 2016 3:37 pm

He vuelto a este hilo, porque estoy empezando a pelearme con mapas de tiles y no sé cual es la aproximación que debo darle al tema.

He mirado tanto este hilo como el ejemplo de scroll por hardware que usa tiles de GnG.

Lo que quiero hacer es ponerle un fondo basado en tiles a Space Moves. En dicho juego para pintar el suelo tengo un array de unos 1000 bytes, donde indico donde hay suelo, extremos de suelo y agujeros (entre otras cosas, como los enemigos).

A la hora de pintar, en realidad pinto dos filas de tiles, porque sé que tile va debajo de cada cual y así me ahorro los 1000 bytes de la fila inferior de tiles.

Ahora bien, si quiero poner más filas para poner un fondo sobre el suelo, digamos por ejemplo que paso de tener de 1 (ó 2) a 4 ó 6 filas de tiles. En teoría si diseño el mapa usando Tiled, que es mi idea viendo el ejemplo del GnG, tendría un array de 6 * 1000 posiciones. Eso son aproximadamente 6KB en RAM, que aunque los comprima, tendré que usar en crudo y por lo tanto necesitaré ese espacio.

Si en lugar de usar bytes para la definición de tiles uso arrays de bits, obviamente la cosa ocupará sustancialmente menos, pero tengo dudas sobre si debería utilizar una aproximación así o bien, seguro, hay maneras mejor de conseguir esto. También se me plantea el cómo pasar de un fichero de Tiled a un array de bits, en lugar de un array de bytes. Obviamente podría programarme una utilidad para ello.

Como es evidente que esto se la ha tenido que plantear mucha gente muchas veces antes que yo, ¿qué opciones tengo?

Muchas gracias.

Avatar de Usuario
ronaldo
Forum Addict
Forum Addict
Mensajes: 358
Registrado: Sab 14 Sep , 2013 9:31 pm
Ubicación: Alicante
Contactar:

Re: Ejemplo de Tilemap con BitArrays en CPCtelera

Mensajepor ronaldo » Jue 07 Abr , 2016 3:46 pm

La mejor opción posible sería tener desarrollados los easyTileMaps con soporte para bitarrays. Cuando empecé a desarrollar los easyTileMaps diseñé una opción para poder configurar funciones propias de obtención de tiles, lo que permitiría usar bitarrays. Sin embargo, esa parte aún está sólo en el limbo del diseño.

Las opciones, a priori, son:
  • Utilizar bitarrays y montar el sistema de pintado de tiles en pantalla ad-hoc. Creo que es la más conveniente si quieres optimizarlo para tu caso.
  • Utilizar bitarrays combinado con un tilemap en memoria que vayas modificando conforme "descomprimes" del bitarray. Más cómodo, pero probablemente mucho más lento y poco flexible para tu caso.
  • Comprimir el mapa a trozos de modo que sólo tengas descomprimido uno o dos trozos en cada momento en memoria y puedas anticiparte descomprimiendo el siguiente cuando se esté llegando.
Tampoco hay conversor de Tiled a bitarrays, aunque esto último es bastante sencillo de hacer ahora mismo utilizando las macros para definir bitarrays. Puedes hacer una utilidad de postprocesado que lo haga: seguro que no te lleva mucho.

Avatar de Usuario
AmstradGamer
Forero habitual
Forero habitual
Mensajes: 189
Registrado: Dom 08 Jun , 2014 10:08 am

Re: Ejemplo de Tilemap con BitArrays en CPCtelera

Mensajepor AmstradGamer » Jue 07 Abr , 2016 3:57 pm

Gracias por la respuesta y propuestas.

Creo que iré a por la primera de ellas que es lo que tenía en mente y me parece lo más cómodo. Si uso compresión será más bien para descomprimir los diferentes mapas de tiles de los diferentes niveles.

¡Me pongo a ello! o8P


¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot]


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic