Programacion en Nintendo DS. Modificar el tilemap – Nuevas funciones.

Buenos dias!
El desarrollo de mi pequeño juego me ha obligado a realizar un par de funciones que mucha gente encontraria de utilidad, asi que las he añadido a mi libreria.
Las funciones nos permitiran saber el tile que se encuentra en las coordenadas que indiquemos de un fondo en concreto, para poder realizar cambios en el, por ejemplo, destruir partes del decorado, realizar animaciones en el fondo (cascadas, arboles moviendose, etc) de una manera bastante simple.
Las instrucciones en concreto son 3:
 
NF_GetTileOfMap(u8 screen, u8 layer, u16 tile_x, u16 tile_y);   (ver codigo fuente)
Esta funcion nos devuelve el valor del tile que se encuentra en las coordenadas especificadas (en tiles, no pixeles), del mapa cargado en la capa y pantallas especificados.
 
NF_SetTileOfMap(u8 screen, u8 layer, u16 tile_x, u16 tile_y, u16 tile);   (ver codigo fuente)
Similar a la funcion anterior, pero esta lo que hace es cambiar el valor del tile, con lo que es posible alterar el decorado.
  
NF_UpdateVramMap(u8 screen, u8 layer);   (ver codigo fuente)
Actualiza en la pantalla (VRAM) los cambios realizados en el tilemap. Usa esta funcion para que se reflejen en la pantalla los cambios realizados. Usala una vez por frame, una vez modificados todos los tiles necesarios. Si la usaras en cada tile modificado, solo conseguirias ralentizar la ejecucion de tu codigo.
 
Aqui podeis ver una demo de estas funciones, en la cual dependiendo de la tecla que pulsemos (A, B, X, Y) cambiamos el tile sobre el que se encuentra el cursor.
 

 
El codigo fuente de estre proyecto asi como la ROM compilada se encuentra en el archivo .7z de la libreria que os dejo a continuacion:
 
NightFox’s Lib for Libnds 20090628
 
Espero que el tutorial y la actualizacion de hoy de mi libreria os sean de utilidad en vuestros proyectos.
Un saludo a todos y hasta la proxima entrada ^^
 
NightFox

Programacion en Nintendo DS. Rutinas basicas de lectura del Keypad

Hola!
Hace dias que queria tocar el tema de la lectura de las teclas y keypad, pero al ser tan facil en las Libnds lo he ido dejando. Lo cierto es que por facil que sea, siempre es de agradecer tener unas funciones que lean todas las teclas y su estado y lo almacenen en una estructura de variables que podamos consultar desde cualquier lugar. En mi caso, me he creado una estructura en un archivo .h (llamemosle nf_input.h) y la funcion de lectura del keypad en un archivo .c (llamemosle tambien nf_input.c). Asi pues, incluyendo en nuestro codigo la linea
 
#include "nf_input.h"
 
Podremos acceder a la estructura que hemos creado para almacenar los datos del keypad.
 
Aqui teneis el codigo fuente del archivo .h
http://nightfox.pastebin.com/f4259eef6
 
Y el codigo fuente del archivo .c
http://nightfox.pastebin.com/f19d7b435
 
Asi, si ejecutamos la instruccion en nuestro codigo ReadKeypad(); las 3 estructuras de variables seran actualizadas con el estado de todas las teclas.
Asi si queremos saber si la tecla A esta pulsada en ese momento hariamos:
 
ReadKeypad();
if (keyheld.a) // La tecla A esta pulsada;
 
La funcion ReadKeypad(); puede ser ejecutada desde cualquier parte del codigo o modulo y solo es necesario hacerlo una vez por frame.
Y poquita cosa mas. Espero que esta entrada cortita os haya sido util para un primer contacto con las funciones de entrada de la DS.
 
Saludos
 
NightFox

Programacion en DS. Efectos graficos basicos – Alpha Blending

Buenas tardes.
Dado que estoy inmerso en un mini proyecto para la compo de SceneBeta, estoy desarrollando un conjunto de nuevas funciones, algunas de las cuales incorporare a mi libreria, otras no, dado que ya son increiblemente simples con las ultimas Libnds.
Este es el caso de los efectos de transparencia (Alpha Blending).
El hardware 2D de la DS (y tener este punto en cuenta), permite un solo canal alpha de 5 bits (es decir, 32niveles, de 0 a 31) entre 2 objetos. Entenderemos por objetos las capas de fondos tileados (0 – 3), los sprites y el backdrop. Explicar que es el backdrop es algo complejo, digamos que es una pared solida al fondo de todo lo demas, que no podemos (en principio) modificar y que sirve como fondo a todo lo que se dibuja encima.
El alpha blending se debe aplicar via registro a dos objetos, "origen" y "destino". Entendemos como origen el objeto que queremos que tenga el efecto de semi-transparencia y como destino el objeto sobre el que sera semitransparente. Imaginemos que tenemos en el fondo 3 una montaña y en el 2 unas nuves que queremos que sean semi-transparentes. Pues el objeto origen seria la capa 2 y el objeto destino la capa 3.
Una vez contado esto, vamos a ver como se haria:
Primero debemos habilitar el modo alpha entre los objetos que deseemos:
 
REG_BLDCNT = BLEND_ALPHA | BLEND_SRC_BG2 | BLEND_DST_BG3;
 
Esto habilitaria en Alpha blending entre los fondos 2 y 3 de la pantalla superior
 
REG_BLDCNT_SUB = BLEND_ALPHA | BLEND_SRC_SPRITE | BLEND_DST_BG0;
 
Y esto entre los sprites habilitados para alpha blending (tocaremos ese tema otro dia) y el fondo 0 de la pantalla inferior.
 
El siguiente paso es decirle que valor tiene el valor alpha. Esto lo haremos mediante la modificacion de otro registro, aplicando los coeficientes de transparencia a cada objeto. El coeficiente del primer objeto lo define los bits 0 al 4 del registro y los bits del 8 al 12 definen el coeficiente del segundo objeto.
Por ejemplo, para que nuestras nubes de la capa 2 de la pantalla superior fueran casi transparente, aplicariamos unos coeficientes similares a estos:
 
REG_BLDALPHA = 0x06 | (0x0F << 8);
 
Notar que para hacerlo mas "facil" los valores estan en HEXADECIMAL, pero vamos, es costumbre. Los valores coeficiente de alpha para la capa 2 es de 6 (0x06) y el coeficiente de las montañas (capa 3) es de 15. Si necesitamos cambiar los valores del alpha de la pantalla inferior, el registro seria REG_BLDALPHA_SUB.
Si os fijais, hay un BITSHIFT en el segundo parametro. Dado que tenemos que modificar los BITS del 8 al 12, que mejor manera de hacerlo que con un BITSHIFT ^^.
 
Si quereis profundizar un poquito mas por vuestra cuenta, he encontrado la informaion relativa a esto en la siguiente URL:
http://dev-scene.com/NDS/DOCgraphicmodes#Special_Registers
 
La info esta un poco "obsoleta" y los nombres de los registros no corresponden a los definidos en las ultimas Libnds. Para ver las equivalencias, podeis consultar el archivo "registers_alt.h" en el directorio del devkitpro.
 
Poquita cosa mas, solo dejaros un video para que veais la aplicacion practica de lo que os he expuesto hoy:
 

 
Como podeis ver (mas o menos) en este video, las rayas de interferencia, son semitransparentes, usando el efecto que os he explicado hoy.
Un saludo a todos y espero que la entrada de hoy sea de probecho.
 
NightFox

Programacion en DS. Uso de la libreria EFS.

Buenas noches.
Antes que nada pedir disculpas por este mes de ausencia, pero temas de trabajo han requerido mi atencion y no he podido dedicarme a esto.
Dicho esto, pasemos a las novedades de hoy.
Recientemente el equipo de las PALIB (con los que colaboro habitualmente) han empezado a actualizar esta libreria para hacerla compatible con las ultimas LIBNDS. Bien, adicionalmente, mucha gente usaba unas librerias llamadas EFS, las cuales permitian encapsular todos los archivos necesarios para nuestro proyecto dentro de la ROM, de una manera muy parecida a como funciona un ROM comercial, con lo que se facilita la distribucion de nuestra ROM y facilita su uso, ya que no obligamos al usuario a tener que tener la ROM en una carpeta espcificada. Tambien debeis saber que todas las ROMS que usen EFS, son compatibles con el emulador NO$GBA, lo que nos facilita enormemente la tarea de debug.
Las ventajas son muchas, las desventajas, la carga es bastante mas lenta que usando FAT, pero nada dramatico. Tambien comentaros que se pueden usar los dos sistemas a la vez, lo cual es muy util para los savegames y demas.
 
Asi que ya que las EFS son de nuevo compatibles con las ultimas LIBNDS, las he integrado en mis librerias.
Los que ya las esteis usando, tranquilos, solo debereis copiar junto a los archivos de mi libreria, los archivos "efs_lib.h" y "efs_lib.c" a la carpeta source de vuestro proyecto.
Los que ademas querais experimentar con las EFS, adicionalmente debereis usar el MAKEFILE especial que hay en la carpeta EFS de mi libreria y copiar el archivo "efs.exe" en la misma carpeta donde tengais el makefile. Ademas, debereis crear una carpeta llamada "EFSROOT" en ese mismo sitio y poner todos los archivos que deseeis cargar en vuestro proyecto dentro de esa carpeta.
Cuando compileis vuestro proyecto, el makefile informara al NDSTOOL que coja todos los archivos contenidos en la carpeta EFSROOT y los añada a la ROM generada. Ademas, tambien ejecutara la utilidad EFS.EXE para parchear la ROM y hacerla compatible con EFS.
 
Para poner las cosas faciles, he modificado la funcion de mi libreria "NF_SetRootFolder()" la cual ahora ademas de especificar el ROOT de nuestro proyecto, inicializara el sistema EFS o FAT, dependiendo del nombre de carpeta que le demos.
Por ejemplo, NF_SetRootFolder("mijuego"); inicializara el sistema FAT y definira la carpeta "mijuego" como la raiz de nuestro proyecto.
Por contra NF_SetRootFolder("EFS"); inicializara los sistemas EFS y FAT, usando EFS por defecto.
Cuando useis EFS, podeis cambiar del sistema EFS al FAT y viceversa usando estos comandos:
chdir("efs:/"); Cambia a la raiz del sistema EFS.
chdir("fat:/"); Cambia a la raiz del sistema FAT.
 
El el archivo 7z de mi libreria que os dejo hoy, encontrareis el ultimo proyecto que os deje aqui, pero usando EFS, para que veais las diferencias.
Recordad que dado que he incluido soporte nativo para EFS, aunque no lo useis, los archivos EFS_LIB.H y EFS_LIB.C deben copiarse junto con los de mi libreria en la carpeta SOURCE, ya que son necesarios para la compilacion sin errores.
Lo mas seguro es que a partir de ahora, siempre use EFS en mis tutoriales, ya que es mas rapida y limpia la distribucion y testeo, ya que funciona sin mas en el emulador NO$GBA.
 
Aqui teneis la ultima version de mi libreria, junto con las EFS corregidas por el equipo de las PALIB.
NightFox’s Lib para LIBNDS Ver. 20090621
 
Un cordial saludo y hasta la siguiente entrada.
 
NightFox