19 de Diciembre de 2018
Mayo
12

Programacion en DS. Mapas de colisiones.

Hola!
 
Antes que nada, todo el mundo a actualizarse a la R26 del DevKitArm, basicamente corrige los fallos de la libfat con el emulador ideas, asi que ya tardais. Es muy comodo poder probar el codigo en el emulador, no ?
 
Mas novedades, he corregido un despiste en la libreria de fondos tileados, que en tamaños muy concretos de fondos, no mostraba la parte inferior. Ademas ahora obligo a que los fondos sean divisibles x256 pixeles (el tamaño que entiende la DS), asi evitamos bugs raros, tanto en la DS como usando el GRIT. Los espacios que no necesiteis, los rellenais de color rosa (0xFF00FF) que es el transparente y listos. Ocupar en VRAM, ocuparan lo mismo.
 
Pasemos al tema de hoy, los mapas de colisiones.
Estos se usan en juegos de plataformas y similares para saber que partes de nuestro fondo son o no "atravesables" por los sprites, por ejemplo, muros, escaleras, agua.
No son pixel perfect (se puede llegar, pero eso otro dia) asi que hoy, nos conformaremos en tener la precision de un tile (8x8 pixeles).
 
La teoria es sencilla, dibujamos un fondo usando colores planos, donde cada color le daremos un sentido, nada, muro, puerta, etc. Las rutinas de lecturas de este mapa, devolveran que tipo de tile tenemos en las coordenadas que le proporcionemos, asi sabremos si estamos delante un muro o si no hay nada y podemos continuar.
En este video se ve mas claramente, vereis que arriba se indica sobre que tile esta posicionado el cursor:
 

Para ver este video es necesario tener JavaScript activado y el plugin Flash instalado en el navegador.

 
 
Cuando creemos el mapa de colisiones, debera ser del mismo tamaño que la parte util de nuestro fondo, mas una fila de 1 tile (8 pixeles) que usaremos para definir nuestro tileset. Cuando GRIT convierte los mapas, asigna numeros a partir del 0 y correlativos a los diferentes tiles que encuentra. Si los primeros que dibujamos en esa fila extra son de colores rosa, negro y blanco, al leerlos tendremos que los tiles rosa seran 0, los tiles negros 1 y los tiles blancos 2. En un fondo de 256x256 pixeles, nuestro mapa medira 256x264 pixeles, teniendo 32 tiles disponibles para definir nuestro tileset (la fila extra de 32 tiles de la pare superior).
 
En otra entrada dare mas detalles, asi como la documentacion (que no he tenido tiempo a preparar).
De momento os dejo el proyecto para que lo empeceis a probar.
 
NightFox Lib para Libnds R25/R26
 
En la carpeta GRIT encontrareis todos los BATs necesarior para convertir los diferentes tipos de archivos a los que usa mi libreria.
 
Un saludo a todos y a disfrutarlo.
 
NightFox

0

14 Comentarios:

Problema con el puntero

Buenas . Escribo porque tengo un problema con el tutorial. Funciona correctamente excepto que no puedo visualizar el puntero en pantalla (sin embargo si veo todo los demás fondos, al moverse ve bien dónde está situado el puntero,etc.) . Lo que hice fue pasarle el grit al puntero.bmp y copiar el .img y .pal correspondiente. Probé con un puntero que hice yo por Photoshop pero que va, tampoco se veía. ¿A que puede ser debido esto? Un saludote y gracias por adelantado.

Te has acordado de poner

Te has acordado de poner esto

// Actualiza el array del OAM
NF_SpriteOamSet(0);
 // Espera al sincronismo vertical
swiWaitForVBlank();
// Actualiza el OAM
oamUpdate(&oamMain);
 
Si no actualizas el array del OAM y el OAM propiamente dicho (en ese orden y esperando al VBLANK) no veras ningun sprite en pantalla.

Holap

Buenas Night. Gracias por responder. Lo he compilado con tu ejemplo, no he cambiado nada de lo que había, por eso me extraña que no me saliera, cuando en tu vídeo sale bien :S . Lo único es que he sido yo el que ha pasado el GRIT al puntero , no se si el archivo estará mal o algo. No sé, ¿ves alguna solución posible? Un saludote y ¡gracias!

Esperamos con ansia

Esperamos con ansia ese tutorial. Andamos probando este último pero nos está dando bastantes quebraderos de cabeza. A ver si se anima la cosa que últimamente sólo posteamos dos :S, y la verdad que estos tutoriales merecen más jejeje. ¡Un saludote! ¡Y esperamos ver pronto una nueva entrada!

Os funciona usando el

Os funciona usando el puntero del ejemplo ?

Que va

Que va, aún no tira xP Un saludote

FAT y emulador

Hola He actualizado a la nueva version r26 pero sigo sin hacer funcionar el .nds en iDeaS o cualquier otro emulador cuando uso FAT. Te he seguido desde un post de hace mucho tiempo a tu blog, que tb preguntabas sobre ese tema, y justo me encuentro que ahora es aun mas facil... y aun asi no me funciona..no se que hacer! yo pongo por ejemplo: c:/miprograma.nds En que directorio tengo que poner los archivos entonces? por ejemplo para poner un fondo hecho con gfx? solo son los bin, no? es que tener que copiarlo cada vez en la tarjetita me esta matando :)

He conseguido que se viera

He conseguido que se viera pero tarda muchisimo en salir..como 1 minuto o mas.. y encima se ve mal... como movido todo. que puede pasar? En que background es preferible poner los fondos? hay que inicializarlo de alguna manera?

Dependiendo del numero de

Dependiendo del numero de archivos puede tardar bastante en el ideas. Los fondos, cargas los convertidos con el GRIT ? Has intentado usar las rutinas de carga de mis librerias?

Toño, has intentado usar el

Toño, has intentado usar el ejemplo incluido en la libreria, por que hoy lo he recompilado (por si acaso) y funciona todo ok como el video ^^

Buenas

Buenas Night. He conseguido que funcione. Creo que cuando lo probé la primera vez no recompilé el proyecto, directamente cogí el .nds que había en la carpeta NFlib, posiblemente fuera por eso. Ahora tengo unos problemas y dudas. Cuando creo un fondo/sprite para que contenga una parte invisible utilizo el mismo color que utiliza usted , pero no me pilla la transparencia (ni aunque ponga un fondo detrás), se ve con ese color rosa en la consola. ¿Que editor de imágenes usa? Yo uso Photoshop y me ocurre ese problema, guardo la imágen como color indexado a 8 bits, no sé cuál podría ser el problema :S. Otra problema me surge en el mapa de colisiones. Creo mi mapa teniendo en cuenta lo del tile de arriba para definir el tileset. En mi ejemplo el mapa es de 256 x 256 , (256 x 264 con el tileset) con 4 colores en el tileset, los mismos que en el suyo. ¿Cuando convierto con grit, debo convertir el mapa a 256x256 o 256x264 ? Yo lo hago con 256x256 eliminando el tile inferior y subiendo un tile todos los elementos del mapa para cuadrar. Cuando hago esto, no me reconoce uno de los 4 colores bien ya que el rojo me lo detecta como 1 (y no el vacio(rosa), como debería ser) y por tanto no me reconoce último color tampoco. ¿Esto pudiera ser debido por la no transparencia del color rosa? Ya que el fondo que utilizo para probar el mapa de colisiones, las partes transparentes, como dije antes, las muestra como rosas. Bueno, espero haberme explicado bien. A ver si pudieras guiarme más que nada en lo de la imágen con fondo transparente, que eso me ayudaría bastante para avanzar. Un saludote y como siempre, ¡muchas gracias por su disposición!

Vamos por partes ^^. El

Vamos por partes ^^.
El color transparente. GRIT usa de manera predeterminada el color rosa (FF00FF en photoshop) el problema es que cuando se indexa, ese debe ser el primer color de la paleta y a veces el photoshop no lo pone ahi. La solucion es forzar ese color en la paleta. Cuando indexes, usa la opcion exacta si son menos de 256 colores o Local (Adaptable) y en forzar colores selecciona "A medida" y define el rosa (FF00FF) como el primer color. Con eso solucionado.
Los mapas de colision debes convertir los dos, el de 256x256 que cargaras como fondo y no debe de contener el tilesed de la fila superior y el cual puede tener el grafico que quieras y el mapa de colisiones de 256x264, el cual lo debes cargar como mapa de colisiones.
Convierte cada archivo con su BAT correspondiente, "Convert_Backgrounds.bat" para fondos y "Convert_CMaps.bat" para los mapas de colision.

El resultado seria este:
 
Fondo con graficos
Mapa de colisiones

Como ves, la primera imagen es nuestro decorado y la segunda el mapa que le indicara a nuestro codigo que partes podemos atravesar, cualas no y donde esta el final
 
Un saludo

NightFox

¡Muchisimas gracias!

Has resuelto todos los problemas que teníamos jejejeje. Una última pregunta referente a los mapas de colisiones, si el cmap mide 256x264, ¿En el código tenemos que poner su medida real (los 256x264) o la medida del fondo (256x256)? Hago esta pregunta, quizás algo tonta, por que coloca 768x512 en su ejemplo al cargar el .cmp, cuando en realidad debería medir 768x520 por los 8 más del tileset . Bueno, en serio, muchas gracias, nos está ayudando mucho y sin pedir nada a cambio y eso es algo que dice mucho de usted. ¡Un gran saludote! Esperamos algún día estar a su nivel jejeje.

Se tienes que poner las

Se tienen que poner las medidas REALES del mapa, es decir lo qe se vera por pantalla. Los 8 pixeles de la primera linea el codigo de la libreria los "ignora" ya que cuando se carga como mapa de colisiones, la libreria ya sabe que debe de ignorar esos 8 pixeles, dado que contienen la definicion de tiles.
Asi que aunque el mapa de colisiones mida 256x264, como la parte util sigue siendo 256x256 esa sera la medida que especificaremos.