Feliz 2010 a todos!. Ultima version de NFlib con un bug corregido.

Pues eso!
Feliz 2010 a todos!
Y de regalo de fin de año la ultima version para este año de mi libreria para la programacion en Nintendo DS con los siguientes cambios:
 
– Actualizado el Makefile a la version R27.
– Textos: Corregido un bug en la funcion NF_ClearTextLayer(); que provocaba desbordamientos de memoria al usarla (cosas de poner un bitshift mal por un despiste).
 
La descarga: NightFox’s Lib para Libnds Ver. 20091231
 
Y nada mas, un deseo de todo corazon a todos los visitantes de mi blog para que este proximo 2010 sea fantastico para todos!
 
Un abrazo
 
NightFox
 

NightFox’s Lib para Libnds. Actualizacion a devkitPro R27.

Buenas tardes!
Con motivo de la salida del devkitPro R27, os dejo la libreria recompilada con esta version del devkitArm.
Tanto la libreria como los ejemplos que incluye han sido (mas o menos) testeado sin observar problemas.
Solo mencionar que desde esta version el no$gba registra varios errores (en la ventana de debug) los cuales tambien se presentan al probar los ejemplos que vienen de serie con Libnds, por lo que de momento no le daremos importancia. Si alguien detecta algun error que con la version R26 no estava presente, por favor, reportarmelo.
Podeis conseguir la version R27 del devkitPro, asi como ver las novedades que incorpora en este enlace:
 
devkitPro R27
 
Y la version recompilada de mi libreria, con algunos ejemplos añadidos (ver el changelog.txt)
 
NightFox’s Lib para Libnds 20091207
 
Saludos a todos
 
NightFox

Programacion en Nintendo DS, crear el efecto de reflejo del agua.

Hola!
 
Mas mini ejemplos de efectos utiles hechos con mi libreria ^^
 
El efecto de hoy: El reflejo en el agua.
Aqui teneis el codigo fuente:
 

  1. /*
  2. ————————————————-
  3.         NightFox’s Lib Template
  4.         Ejemplo de efecto onda (con scroll)
  5.         Requiere DevkitARM R26
  6.         Requiere NightFox’s Lib
  7.         Requiere EFS Lib
  8.         Codigo por NightFox
  9.         http://blogs.gamefilia.com/knightfox
  10.         Inicio 10 de Octubre del 2009
  11.         (c)2009 NightFox & Co.
  12. ————————————————-
  13. */
  14. /*
  15. ————————————————-
  16.         Includes
  17. ————————————————-
  18. */
  19. // Includes c/c++
  20. #include <stdio.h>
  21. // Includes propietarios NDS
  22. #include <nds.h>
  23. // Includes librerias propias
  24. #include "nf_lib.h"
  25. // Defines especiales del ejemplo
  26. #define VLINE *(vu16*)0x04000006                // Obtiene via registro la linea actual del dibujado
  27. // Variables del efecto wave
  28. u16 mapa[32][24];       // Almacena el mapa
  29. s16 bgx[192];           // Posicion X de cada linea
  30. s8 i[192];                      // Control de movimiento de cada linea
  31. // Variables para el control de fondo
  32. s16 bg_x[4];
  33. // Define la funcion a ejecutar para el HBLANK
  34. void _WaveEffect(void);
  35. /*
  36. ————————————————-
  37.         Main() – Bloque general del programa
  38. ————————————————-
  39. */
  40. int main(void) {
  41.         // Pantalla de espera inicializando la EFS
  42.         NF_Set2D(0, 0);
  43.         NF_Set2D(1, 0)
  44.         consoleDemoInit();
  45.         iprintf("n EFS init. Please wait.n This can take up to 5 minutes.nn");
  46.         iprintf(" Iniciando EFS,n por favor, espere.n Puede tardar hasta 5 minutos.n");
  47.         swiWaitForVBlank();
  48.         // Define el ROOT e inicializa el sistema de archivos
  49.         NF_SetRootFolder("EFS");        // Define la carpeta ROOT para usar EFS
  50.         // Inicializa el motor 2D
  51.         NF_Set2D(0, 0);                         // Modo 2D_0 en ambas pantallas
  52.         NF_Set2D(1, 0);
  53.         // Inicializa los fondos tileados
  54.         NF_InitTiledBgBuffers();        // Inicializa los buffers para almacenar fondos
  55.         NF_InitTiledBgSys(0);           // Inicializa los fondos Tileados para la pantalla superior
  56.         NF_InitTiledBgSys(1);           // Iniciliaza los fondos Tileados para la pantalla inferior
  57.         // Carga los archivos de fondo desde la FAT/EFS a la RAM
  58.         NF_LoadTiledBg("bg/layer0", "layer0", 512, 256);        // Carga el fondo para la pantalla inferior
  59.         NF_LoadTiledBg("bg/layer1", "layer1", 512, 256);        // Carga el fondo para la pantalla inferior
  60.         NF_LoadTiledBg("bg/layer2", "layer2", 512, 256);        // Carga el fondo para la pantalla inferior
  61.         NF_LoadTiledBg("bg/layer3", "layer3", 512, 256);        // Carga el fondo para la pantalla inferior
  62.         NF_LoadTiledBg("bg/nfl", "nfl", 256, 256);                      // Carga el fondo para la pantalla inferior
  63.         // Crea los fondos de la pantalla superior
  64.         NF_CreateTiledBg(0, 3, "layer3");
  65.         NF_CreateTiledBg(0, 2, "layer2");
  66.         NF_CreateTiledBg(0, 1, "layer1");
  67.         NF_CreateTiledBg(0, 0, "layer0");
  68.         // Crea los fondos de la pantalla inferior
  69.         NF_CreateTiledBg(1, 3, "nfl");
  70.         // Inicializa el efecto wave
  71.         s16 x = 0;
  72.         s16 y = 0;
  73.         s8 inc = 1;
  74.         for (y = 138; y < 192; y ++) {
  75.                 if ((y >= 138) && (y <= 159)) {
  76.                         bgx[y] = 32;
  77.                         inc *= -1;     
  78.                         i[y] = inc;
  79.                 }
  80.                 if ((y >= 160) && (y <= 191)) {
  81.                         bgx[y] = ((y – 156) >> 1);
  82.                         i[y] = inc;
  83.                         inc *= -1;
  84.                 }
  85.         }
  86.         // Y definimos que funcion se ejecutara al final de cada linea de dibujado (HBLANK)
  87.         irqSet(IRQ_HBLANK, _WaveEffect);
  88.         // Para finalizar, habilitamos la interrupcion
  89.         irqEnable(IRQ_HBLANK);
  90.         // Lectura del keypad
  91.         u16 keys = 0;
  92.         // Bucle (repite para siempre)
  93.         while(1) {
  94.                 // Lee el keypad
  95.                 scanKeys();
  96.                 keys = keysHeld();
  97.                 // Mueve el fondo
  98.                 if ((keys & KEY_LEFT) && (bg_x[0] > 8)) bg_x[0] –;
  99.                 if ((keys & KEY_RIGHT) && (bg_x[0] < 247)) bg_x[0] ++;
  100.                 // Calcula el parallax
  101.                 bg_x[1] = (int)(bg_x[0] / 1.5);
  102.                 bg_x[2] = (int)(bg_x[1] / 1.5);
  103.                 bg_x[3] = (int)(bg_x[2] / 1.5);
  104.                 swiWaitForVBlank();             // Espera al sincronismo vertical
  105.                 NF_ScrollBg(0, 3, bg_x[3], 0);
  106.                 NF_ScrollBg(0, 2, bg_x[2], 0);
  107.                 NF_ScrollBg(0, 1, bg_x[1], 0);
  108.                 NF_ScrollBg(0, 0, bg_x[0], 0);
  109.         }
  110.         return 0;
  111. }
  112. void _WaveEffect(void) {
  113.         if ((VLINE >= 138) && (VLINE <= 159)) { // Si la linea esta entre la 0 – 191, ejecuta el efecto
  114.                 bgx[VLINE] += i[VLINE];
  115.                 if ((bgx[VLINE] < 1) || (bgx[VLINE] > 63)) i[VLINE] *= -1;
  116.                 NF_ScrollBg(0, 1, bg_x[1] + ((bgx[VLINE] >> 3)4), 0);
  117.         }
  118.         if ((VLINE >= 160) && (VLINE <= 191)) { // Si la linea esta entre la 0 – 191, ejecuta el efecto
  119.                 bgx[VLINE] += i[VLINE];
  120.                 if ((bgx[VLINE] < 1) || (bgx[VLINE] > (VLINE – 156))) i[VLINE] *= -1;
  121.                 NF_ScrollBg(0, 0, (bg_x[0] + (((VLINE – 156) >> 1) – bgx[VLINE])), 0);
  122.         }
  123. }

Aqui teneis el enlace un poco el codigo un poco mas decente:
http://nightfox.pastebin.com/f479cdb4b

Y como no el video del resultado final (la calidad del youtube no mata)
 
 
 
La rom compilada aqui: http://www.mediafire.com/?numlyjzznzk
 
Y eso es todo por hoy, buen fin de semana a todos!
 
NightFox
 

Programacion en Nintendo DS. Efecto espejo + ondas en un fondo tileado (requiere mis librerias)

Hola!
 
Pensando que ejemplos incluir en mi libreria, se me ha ocurrido este:

  1. /*
  2. ————————————————-
  3.         NightFox’s Lib Template
  4.         Ejemplo de efecto onda (simple)
  5.         Requiere DevkitARM R26
  6.         Requiere NightFox’s Lib
  7.         Requiere EFS Lib
  8.         Codigo por NightFox
  9.         http://blogs.gamefilia.com/knightfox
  10.         Inicio 10 de Octubre del 2009
  11.         (c)2009 NightFox & Co.
  12. ————————————————-
  13. */
  14. /*
  15. ————————————————-
  16.         Includes
  17. ————————————————-
  18. */
  19. // Includes c/c++
  20. #include <stdio.h>
  21. // Includes propietarios NDS
  22. #include <nds.h>
  23. // Includes librerias propias
  24. #include "nf_lib.h"
  25. // Defines especiales del ejemplo
  26. #define VLINE *(vu16*)0x04000006                // Obtiene via registro la linea actual del dibujado
  27. // Variables
  28. u16 mapa[32][24];       // Almacena el mapa
  29. s16 bgx[192];           // Posicion X de cada linea
  30. s8 i[192];                      // Control de movimiento de cada linea
  31. // Define la funcion a ejecutar para el HBLANK
  32. void _WaveEffect(void);
  33. /*
  34. ————————————————-
  35.         Main() – Bloque general del programa
  36. ————————————————-
  37. */
  38. int main(void) {
  39.         // Pantalla de espera inicializando la EFS
  40.         NF_Set2D(0, 0);
  41.         NF_Set2D(1, 0)
  42.         consoleDemoInit();
  43.         iprintf("n EFS init. Please wait.n This can take up to 5 minutes.nn");
  44.         iprintf(" Iniciando EFS,n por favor, espere.n Puede tardar hasta 5 minutos.n");
  45.         swiWaitForVBlank();
  46.         // Define el ROOT e inicializa el sistema de archivos
  47.         NF_SetRootFolder("EFS");        // Define la carpeta ROOT para usar EFS
  48.         // Inicializa el motor 2D
  49.         NF_Set2D(0, 0);                         // Modo 2D_0 en ambas pantallas
  50.         NF_Set2D(1, 0);
  51.         // Inicializa los fondos tileados
  52.         NF_InitTiledBgBuffers();        // Inicializa los buffers para almacenar fondos
  53.         NF_InitTiledBgSys(0);           // Inicializa los fondos Tileados para la pantalla superior
  54.         NF_InitTiledBgSys(1);           // Iniciliaza los fondos Tileados para la pantalla inferior
  55.         // Carga los archivos de fondo desde la FAT/EFS a la RAM
  56.         NF_LoadTiledBg("bg/nfl", "nfl", 256, 256);                      // Carga el fondo para la pantalla inferior
  57.         // Crea los fondos de la pantalla superior
  58.         NF_CreateTiledBg(0, 3, "nfl");
  59.         // Crea los fondos de la pantalla inferior
  60.         NF_CreateTiledBg(1, 3, "nfl");
  61.         // Invierte todos los tiles (V) del mapa de la pantalla inferior y copia los tiles al buffer temporal
  62.         s16 x = 0;
  63.         s16 y = 0;
  64.         for (y = 0; y < 24; y ++) {
  65.                 for (x = 0; x < 32; x ++) {
  66.                         NF_SetTileVflip(1, 3, x, y);
  67.                         mapa[x][y] = NF_GetTileOfMap(1, 3, x, y);
  68.                 }
  69.         }
  70.         // Ahora coloca los tiles en orden inverso para compensar la imagen
  71.         for (y = 0; y < 24; y ++) {
  72.                 for (x = 0; x < 32; x ++) {
  73.                         NF_SetTileOfMap(1, 3, x, (23 – y), mapa[x][y]);
  74.                 }
  75.         }
  76.         // Y para finalizar, actualiza el mapa en la VRAM
  77.         NF_UpdateVramMap(1, 3);
  78.         // Inicializa el efecto wave
  79.         s8 inc = 1;
  80.         x = 0;
  81.         for (y = 0; y < 192; y ++) {
  82.                 x += inc;
  83.                 bgx[y] = x;
  84.                 if ((x < 1) || (x > 63)) inc *= -1;
  85.                 i[y] = inc;
  86.         }
  87.         // Ahora vamos a inicializar las Interrupciones
  88.         irqInit();
  89.         // Y definimos que funcion se ejecutara al final de cada linea de dibujado (HBLANK)
  90.         irqSet(IRQ_HBLANK, _WaveEffect);
  91.         // Para finalizar, habilitamos la interrupcion
  92.         irqEnable(IRQ_HBLANK);
  93.         // Bucle (repite para siempre)
  94.         while(1) {
  95.                 swiWaitForVBlank();             // Espera al sincronismo vertical
  96.         }
  97.         return 0;
  98. }
  99. void _WaveEffect(void) {
  100.         if (VLINE < 192) {      // Si la linea esta entre la 0 – 191, ejecuta el efecto
  101.                 bgx[VLINE] += i[VLINE];
  102.                 if ((bgx[VLINE] < 1) || (bgx[VLINE] > 63)) i[VLINE] *= -1;
  103.                 NF_ScrollBg(1, 3, ((bgx[VLINE] >> 3)4), 0);
  104.         }

}


En este enlace podeis ver el codigo con mas condiciones
http://nightfox.pastebin.com/f9491e06

El resultado final (usar la imagen que mas os guste a vosotros) es este
 

 
De todos modos en la proxima version de mi libreria este ejemplo vendra incluido.
 
Saludos y buen fin de semana
 
NightFox

NightFox’s Lib para Libnds (NFLIB) Version 20091202 – Novedades

Buenas tardes,
 
Como no, racion semanal de libreria, con las siguientes novedades:
 
– Fondos 2D: Añadida la funcion NF_GetTilePal(); que permite obtener el numero de paleta que usa un tile en concreto entre las 16 disponibles. Por defecto, los fondos solo cargan una paleta que se carga en el slot 0.
– Fondos 2D: Añadida la funcion NF_SetTilePal(); que permite cambiar el numero de paleta que usa un tile en concreto entre las 16 disponibles.
– Fondos 2D: Añadida la funcion NF_LoadExBgPal(); la cual carga en un slot en RAM una paleta de fondos para poderla usar luego como paleta extendida.
– Fondos 2D: Añadida la funcion NF_UnloadExBgPal(); la cual borra de la RAM la paleta del slot especificado.
– Fondos 2D: Añadida la funcion NF_VramExBgPal(); la cual copia a la VRAM una paleta extendida cargada previamente en RAM.
– Fondos 2D: Añadida la funcion NF_SetExBgPal(); la cual selecciona que paleta extendida cargada en VRAM usara el fondo seleccionado.
– Textos: Añadida la funcion NF_DefineTextColor(); la cual permitira definir hasta 16 colores diferentes por cada capa de texto.
– Textos: Añadida la funcion NF_SetTextColor(); la cual permitira escoger con que color se escribira el texto de entre los 16 definidos por el usuario.
– Fondos 2D: Añadida la funcion NF_SetTileHflip(); que invierte el estado del FLIP horizontal de un tile del mapa especificado.
– Fondos 2D: Añadida la funcion NF_SetTileVflip(); que invierte el estado del FLIP vertical de un tile del mapa especificado.
– Ejemplos actualizados.
– Documentacion actualizada.

 
En los ejemplos podeis ver como poder rotar 180º un fondo tileado, util para los juegos tipo libro si queremos añadir la opcion de diestro o zurdo, hacer espejo de un fondo, poder definir hasta 16 colores para una sola capa de texto, escoger el color del texto a escribir de entre los 16 definidos, seleccionar que paleta usamos para algunos o todos los tiles de un fondo, etc…
 

 
Uso de hasta 16 paletas de 256 colores para un fondo.
 
 

 
Textos con 16 colores diferentes en la misma capa.
 
 

 
Rotacion de 180º de un fondo tileado.
 
 
Y eso es todo, aqui, la descarga de turno:
NightFox’s Lib para Libnds ver. 20091202
 
Podeis dejar las dudas en los comentarios
 
Un saludo a todos!
 
NightFox