20 de Octubre de 2017

Archivo para Junio de 2009 en NightFox & Co - Desarrollo de Homebrew para NDS, blog de KnightFox

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)

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.

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
 

Jun
21

Programacion en DS. Uso de la libreria EFS.

Categorías: ,
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.