[DS] Ayudadme otra vez...

Hola

Ya stoy atascado como siempre... empiezo a deprimirme ya... bueno, aqui dejo los archivos listos para compilar y todo eso... (tiene errores pero compila y se ejecuta...)

http://www.ftp.nu/files/5379/

Bueno, tengo 2 problemas, uno mas serio y el otro mas... molesto...

2) el molesto: no puedo cargar imagenes en la pantalla superior, uso una libreria para descomprimir JPg's pero en la inferior no me aclaro a ponerlos...


1) mas serio: necesito empezar cargando 100 o mas imagenes en la memoria del flash, despues pasar todas las que pueda a los 4 mb de la consola y despues pasar 1 o 2 a la Vram...
Bueno, la idea es ir reservando dinamicamente, pero tampoco me he aclarado... esto ultimo continuo prvando, pero es que el problema de arriba que no se por que sera, me trae muy "loco" bueno, gracias
Lo primero ya siento no haberte respondido antes pero es que he andado muy liado (y sigo pero bueno). Luego al tema

Lo primero echarte la bronca por llamarle ejemplo2 en vez de ejemplo (me he tirado 10 minutos mirando porque no se reflejaban los cambios). Y luego también por dejar find_first_gbfs_file en blitimage.

Bueno sobre el tema de porque no te salen las imagenes abajo. El primer fallo y mas obcio es que configuras el fondo para 256 colores, y las jpg son para 16 bit. Segundo fallo, el mismo que tuviste la otra vez. Sigues sin aclararte con el registro del fondo y donde pones los datos. Si tu en el registro del fondo 2 le dices que vas a poner los datos en el bloque 1 (es decir dirección BG_GFX+16 kbytes) no puedes poner entonces los datos en BG_GFX porque no los encuentra. Tu ten en cuenta que en el registro le dices donde tiene que mirar para encontrar esos datos, asi que si no los pones ahi no puede sacar nada.

Ademas tienes el texto ocupando el primer bloque y sólo tienes un banco de memoria para fondos. Que quiero decir. Que cuando usabas fondos de 256 colores pues no pasaba nada porque un fondo de 256x256 te ocupa 64 kbytes, quedandote espacio para el texto. En cambio ahora usas de 16 bits, con lo cual el sólo te ocupa los 128 kbytes del fondo. Asi que o bien no usas texto en consola con tiles de libnds o asignas otro banco más para fondos.

Intenta solucionarlo tu (para que aprendas como va y veas si lo entiendes) y si no te bajas el adjunto que quita el texto y deja sólo para imagenes de 16 bits (aunque sea tienes la imagen).


Sobre lo segundo yo iria por pasos. Primero crearía una funcion para pasar x imagenes a la ram. Podrías partir de algo de este tipo (función cutre para que te hagas a la idea)

#define MAX_IMAGES 100
u16* imagesRam[MAX_IMAGES];
u16 imageRamPos=0;

void imageToRam(char* name){
u16 *image =malloc(256*256*2);
BltImage(name, image, 256, 256);
imagesRam[imageRamPos++]=image;
}

void menu(){
//Carga fondo superior.
imageToRam("menu_a_1.jpg");
imageToRam("menu_a_1.jpg");
dmaCopy(imagesRam[0],BG_GFX, 256*256*2);
dmaCopy(imagesRam[1],BG_GFX_SUB, 256*256*2);
.....
}

Esto todo está mucho más flexible. Yo usaría una deque de la stl y una estructura que tenga los datos de la imagen (si lo quieres hacer que valga para todo tipo de imágenes y no sólo de un tamaño) pero en c como que de stl nada.

Luego si quisieras hacer doble buffer podrías hacer (ejemplo para una pantalla)

vramSetBankA(VRAM_A_MAIN_BG_0x6000000);
vramSetBankB(VRAM_B_MAIN_BG_0x6020000);

//de ram a buffer en vram (banco B)
dmaCopy(imagesRam[0], (u16*)(0x06020000), 256*256*2);

//de buffer en vram a posición de vram que apunta el registro del fondo
dmaCopy( (u16*)(0x06020000),BG_GFX, 256*256*2);

También podrías usar otro método (no probado) que escribes en un buffer que no sea apuntado por el registro, cambias el registro a que apunte a ese buffer, pintas en el otro buffer, cambias el registro a ese buffer, etc. Vamos que vas haciendo un swap de buffers pudiendo hacer hasta triple buffer si quisieras.

Adjuntos

muchas gracias por responder, pero la verdad es que estoy apunto de volver a usar PAlib aunque no quiera...

Porque soy un negado para el tema de los fondos y todo eso en Libnds... >_<

ahora ya cargaba jpg's de 16 bits... y decido que en la pantalla inferior, prefiero mostrar imagenes de 8 bits y texto, poque seran pocas imagenes y asi estara bien... pues nada, no hay forma...

Puede ser que al usar el GBFS asi concatenado se ralle ? es que le meto el .bin del dibujo y el .bin de la paleta y se queda igual... >_<


Una pregunta: ¿donde habeis aprendido los que sabeis a manejar los fondos? hay algun tutorial claro o algo...?

PD: tambien tiene que ver el emulador, que usaba uno que no me pilla lo de la ram... >_< ahora por lo menos, lo veo pero lo veo mal... muy mal,,, seguramente no sera ni la imagen si no basura...
GBFS no tiene ningún problema de "corrupciones". Esa forma de usar gbfs (concatenada) es en realidad la correcta y en la que realmente se le saca partido (la función find first file existe por esta manera de usarlo).

El problema que tienes es el que te digo, que todavía no terminas de pillar que hace bien cada cosa. Lo que tienes que tener en cuenta a la hora de poner los fonso extendidos rotacionales (que son los que estás usando, fondos 2 y 3 del modo 5) son 2:

-Configurar el registro del fondo de forma adeacuada. En éste sentido tienes 3 partes.
Primero el tipo de fondo, que en libnds incluye tanto profundidad de color como tamaño. Piensa que la información de una imagen de 16 bits, son los colores en si y la información de una de 8 bits son los indices a la paleta. Luego si tu intentas cargar una imagen de 16 bits en un fondo configurado como de 8 bits, la DS cree que le estás pasando indices a una paleta cuando en realidad le estas pasando lo colores de cada pixel.
Lo segundo es donde vas a poner la información de la imagen. Como es un fondo extendido no hay tiles y por tanto mapas. La manera en la que los registros de los fondos encuentran la información es por bloques. En la pantalla principal por ejemplo se empieza a buscar a partir de la dirección 0x06000000 (BG_GFX es un define a esta dirección) que corresponde con el bloque 0 (es por eso que cuando pones el banco A por ejemplo a a la pantalla principal, si te fijas, es a esta dirección, que como ves todo tiene su motivo). El siguiente bloque es 16 kbytes más adelante e igual para los siguientes (es decir sumas 0x4000 a la dirección por cada bloque). Con esto quiero decir que si tu pones en el registro que los datos están en el bloque 0 entonces tienes que ponerlos en la dirección 0x06000000. Si le dices que están en el bloque 1 entonces tienes que poner los datos en la dirección 0x06004000 y asi con los demás. En el caso de los fondos de tipo texto o por tiles o como les quieras llamar pues tienes que teneren cuenta que no solo pones la información de la imagen (que en este caso tiene que estar en tiles,es decir, en bloques de 8x8) si no también el mapa, que indica donde poner cada uno de los tiles (bloques de 8x8).
El tercer punto importante es el del origen de la imagen y la matriz de transformación, que eso lo pone bien (aunque no tendrás muy claro que registro es cual)

-Poner los datos en el sitio adecuado y en el formato adecuado. Sobre lo de poner los datos en el sitio adecuado, ya te lo he explicado en lo de configurar el registro para que apunte a ese sitio. Respecto a el formato adecuado te explico. Cuando usas un fondo extendido, la información se espera de forma normal, es decir los pixel están uno detrás de otro por líneas. En cambio por tiles la cosa va a así (ésta explicación es para tiles en 1 dimensión)


Si no conviertes la imagen a tile la información se la pasarias asi (Siendo cadagrupo de símbolos un tile). imagina que fueran 8 en vez de 4 tanto en vertical como en horizontal

----++++
----++++
----++++ que la DS la leera asi
::::****--------------------> ----++++----++++----++++----++++:::: etc
::::****
::::****
::::****


La DS requiere que la información esté asi

----------------
++++++++++++
:::::::::::
***********
De este modo al leer de forma lineal irá cofiendo bien los tiles. Para convertir

Luego estaría el tema de la paleta que si es de 256 colores el fondo pues tienes que generar una imagen que esté compuesta por los índices a la paleta.

Lo mejor para todo lo anterior es que use gfx2gba (http://www.gbadev.org/tools.php?section=Graphics)
versión 0.13 con el frontend.

Espero haberte aclarado algo.
4 respuestas