NightFox & Co - Desarrollo de Homebrew para NDS
Blog dedicado a los proyectos presentes y futuros desarrollados para la pequeña Nintendo DS
Aficiones: desarrollo, homebrew, nintendo ds, programación, videojuegos
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:
Blog dedicado a los proyectos presentes y futuros desarrollados para la pequeña Nintendo DS
Aficiones: desarrollo, homebrew, nintendo ds, programación, videojuegos
