LibNDS (Imagen y texto en misma pantalla) Ayuda....

Hola, estoy teniendo unos problemillas, a la hora de mostrar una imagen en una pantalla, por ejemplo la principal (abajo), porque o muestro texto, o muestro dibujo, si alguien me puede echar una manita...

Gracias.
No he usado la libnds nunca. Pero de haber estado trabajando con las PALib, que estan basadas en libnds, el problema que asi por encima creo que podria ser es que cargas tanto la imagen como el texto en un mismo background.
La Nintendo DS tiene 4 (0,1,2,3) backgrounds para cada pantalla (4 arriba y 4 abajo) y despues tiene una "capa" extra para objetos. Prueba a cargar en el 0 (el que esta al frente) y el dibujo en el 1 por ejemplo (el que esta justo detras) creo que el orden es asi. Y por lo menos las PALib trabajan con los backgrounds así.

Espero que sirva de ayuda [chiu]
En PAlib, era muy facil, como tu dices habian 4 barckgrounds, y estaban numerados, yo es que estoy migrando de PaLib a LibNDS, y tengo serios problemas con eso de las capas, porque o no me aclaro, o han desaparecido, aunque en principio si que estan, no encuentro ninguna demo que las use, para aprender, ni mucha informacion util...

----

Tambien me gustaria saber si hay alguna forma o alguna funcion para detectar si el stylus esta pulsado una vez, o si lo mantenemmos pulsado, en palib, era lo de Newpressed y lo de Held... el LibNDS, no me aclaro tampoco, y cuando lo mantengo pulsado, me lo coje como muchas pulsaciones... >_<
Iba a escribir más pero se me ha borrado. Resumiendo, probablemente estés sobreescribiendo la VRAM.

Para el fondo de texto:

BG0_CR = BG_MAP_BASE(2)|BG_TILE_BASE(0);
BG_PALETTE[255] = RGB15(31,31,31);
consoleInitDefault((u16*)SCREEN_BASE_BLOCK(2), (u16*)CHAR_BASE_BLOCK(0), 16);

Para la imagen, que supongo casi seguro que será un extended background.

BGX_CR=BG_BMP_BASE(1)| tamaño

A ver si con eso va

///////
Sobre lo de pulsado, que mal debo explicarme en el tutorial. Usa (KEY_TOUCH & keysHeld()) si quieres que te este detectando todo el rato que está pulsada y (KEY_TOUCH & keysDown()) si quieres que sólo detecte la primera vez
int main(void) {

powerON(POWER_ALL); //inicializa los cores 2D y 3D. Necesario en M3 (esto es por lo que algunos homebrew no arrancan)
lcdMainOnBottom();

irqInit();
// install our simple vblank handler
irqSet(IRQ_VBLANK, Vblank);
// enable the interrupt
irqEnable(IRQ_VBLANK);

//sImage pcx; // (NEW) and different from nehe.

vramSetBankA(VRAM_A_MAIN_BG_0x6000000);
vramSetBankC(VRAM_C_SUB_BG_0x6200000);
vramSetBankE(VRAM_E_BG_EXT_PALETTE);

videoSetMode(MODE_5_2D |DISPLAY_BG0_ACTIVE |DISPLAY_BG2_ACTIVE);
//BG2_CR = BG_BMP8_256x256;
//BG2_XDX = 1 << 8;
//BG2_XDY = 0;
//BG2_YDX = 0;
//BG2_YDY = 1 << 8;
//BG2_CY = 0;
//BG2_CX = 0;


BG0_CR = BG_MAP_BASE(2)|BG_TILE_BASE(0);
BG_PALETTE[255] = RGB15(31,31,31);
consoleInitDefault((u16*)SCREEN_BASE_BLOCK(2), (u16*)CHAR_BASE_BLOCK(0), 16);

BG2_CR=BG_BMP_BASE(1)| BG_BMP8_256x256;
iprintf("\n\n\Hola EOL\n");




videoSetModeSub(MODE_5_2D | DISPLAY_BG2_ACTIVE);//5
SUB_BG2_CR = BG_BMP8_256x256;
SUB_BG2_XDX = 1 << 8;
SUB_BG2_XDY = 0;
SUB_BG2_YDX = 0;
SUB_BG2_YDY = 1 << 8;
SUB_BG2_CY = 0;
SUB_BG2_CX = 0;


---------------------------------------
He modificado el codigo, y la imaen sale muy chunga, y el texto , o no sale o sale tb. chungo, si es lo de la Vram, no tendre el fallo al reservar los bancos de memoria? en lo de vramSetBankA.....

Respecto a lo del stylus, lo explicaste bien en el tutorial, porque lo tengo tal cual me has dicho ahora... lo que pasa es que lo he montado de una forma rara, y cada vez que entra a la funcion que he creado de NuevaPulsacionEnZona(x1,y1,x2,y2) pues cree que es nueva pulsacion, supongo que deveria guardar ese valor en una variable global o algo asi...
//BG2_X = 1 << 8;
//BG2_Y = 0;
//BG2_YDX = 0;
//BG2_YDY = 1 << 8;
//BG2_CY = 0;
//BG2_CX = 0;

Eso descomentalo. Luego ten en cuenta que es BG2 es un fondo de 256 colores, asi que necesita una paleta. También tendría que ver la parte de como lo pasas a memoria de video (si lo pasas al comienzo de la VRAM te sigues cargando lo del texto!).
const char *pcx_file1 = gbfs_get_obj(&data_gbfs, "a_01.bin", NULL);
const char *pcx_filePAL1 = gbfs_get_obj(&data_gbfs, "a_01_pal.bin", NULL);

asi es como cargo la imagen. Previamente , la he cargado con GBFS, que para lectura esta bien y parece funcionar en todos flash...
Me refiero para cargar en la VRAM

Para cargar una imagen necesitas algo del estilo

dmaCopy(data, (u16*)(0x6000000+(bgID<<14)), width*height*(bpp>>3));

En el que bgID es lo que pases a BG_BMP_BASE. 0x6000000 es BG_GFX y luego incrementas de 16 kbytes en 16 kbytes (2 a la 14) que es el tamaño de los bloques. Data sería, como cargas imágenes pcx con la función loadpcx, image.data8 (siendo image del tipo sImage). bpp>>3 es dividir entre 8, es decir si es de 16 bits multiplicas por 2 y si es de 8 bits por 1.
dmaCopy(botones_posturas_abajo, BG_GFX, 256*256);
dmaCopy(botones_posturas_abajoPAL, BG_PALETTE, 256*2);

asi es como lo hago
Te falla entonces lo que te digo. Estas poniendo la imagen desde el principio y ahi es donde has puesto los tiles y los mapas para las letras. Además que al indicar con BG_BMP_BASE que la imagen empieza en el bloque 1 tienes que poner la imagen 1 bloque (16 kbytes) más alante.
Gracias, ahora los graficos ya me cuadran y se muestran bien, pero el texto se muestra mal, en el codigo inferior, se ve todo lo que ahgo, y he empezado a cambiar cosas, como los bancos de memoria y eso, pero no he solucionado nada...
Nada, webez, si algun dia quieres que te invite a una comida o una cena, solo dimelo XD... Muchas gracias por haberme contestado...


Como se puede ver intento imprimir con el : iprintf("\x1b[10;10HHello EOL!");
------------------------------------
int main(void) {

powerON(POWER_ALL); //inicializa los cores 2D y 3D. Necesario en M3 (esto es por lo que algunos homebrew no arrancan)
lcdMainOnBottom();

irqInit();
// install our simple vblank handler
irqSet(IRQ_VBLANK, Vblank);
// enable the interrupt
irqEnable(IRQ_VBLANK);

//sImage pcx; // (NEW) and different from nehe.

vramSetBankA(VRAM_A_MAIN_BG_0x6000000);
vramSetBankC(VRAM_C_SUB_BG_0x6200000);
vramSetBankE(VRAM_E_BG_EXT_PALETTE);

videoSetMode(MODE_5_2D |DISPLAY_BG2_ACTIVE);
BG2_CR = BG_BMP8_256x256;
BG2_XDX = 1 << 8;
BG2_XDY = 0;
BG2_YDX = 0;
BG2_YDY = 1 << 8;
BG2_CY = 0;
BG2_CX = 0;

//BG0_CR = BG_MAP_BASE(31);
BG0_CR = BG_MAP_BASE(31)|BG_TILE_BASE(0);

BG_PALETTE[255] = RGB15(31,31,31);
BG2_CR=BG_BMP_BASE(0)| BG_BMP8_256x256;

consoleInitDefault((u16*)SCREEN_BASE_BLOCK(31), (u16*)CHAR_BASE_BLOCK(0), 16);


iprintf("\x1b[10;10HHello EOL!");


while(1){} //para que se quede mostrando solo el texto que es lo que me falla....

videoSetModeSub(MODE_5_2D | DISPLAY_BG2_ACTIVE);//5
SUB_BG2_CR = BG_BMP8_256x256;
SUB_BG2_XDX = 1 << 8;
SUB_BG2_XDY = 0;
SUB_BG2_YDX = 0;
SUB_BG2_YDY = 1 << 8;
SUB_BG2_CY = 0;
SUB_BG2_CX = 0;
Si subes el código y lo necesario para que compile, lo pongo bien y te pongo luego que falla.

Asi de primeras veo que al final estas poniendo la imagen desde el comienzo de la VRAM, lugar donde ahora mismo también tienes los tiles de las letras.

PD: Prueba

BG0_CR = BG_MAP_BASE(31)|BG_TILE_BASE(7);

consoleInitDefault((u16*)SCREEN_BASE_BLOCK(31), (u16*)CHAR_BASE_BLOCK(7), 16);
no, no se ha solucionado, aqui tienes el codigo, ya diras algo cuando puedas, yo continuo provando cosas, pero cada vez, va un poco peor >_< en ocasiones añoro mucho las PAlib y su simpleza para tratar fondos y texto... pero devo resistir... ^^

Link


Gracias
Bueno lo primero es que no se porque maligno motivo, al menos en emuladores si dejas la llamada a la función menu dentro del while, todo se va a tomar por saco (extraño la verdad, tendría que probarlo en hardware a ver como va). Luego he puesto los tiles de las letras al principio de la VRAM y he puesto para que la imagen de 16 bits se pinte 16 kbytes más alante.

PD: Como me ha dado algún problema al bajar pongo este link también

http://rafb.net/paste/results/wJMPEG49.html

Adjuntos

se supone que con estos arreglos deveria funcionar? es que a mi continua sin funcionarme...

iprintf("\x1b[0;10HHello Neopiro!");

Gracias, veo que mas personas se han descargado estos archivos, si alguien quiere, puede, tambien puede aportar sus concimientos.

Gracias
Esta probado que funciona todo (al menos en emu). Si no ves el Hello Neopiro es porque al poner la paleta para la imagen, vuelves a poner a negro el color de la fuente y a penas se ve. He puesto el mensaje en la parte de arriba para ver si lo ves mejor.
yo veo el mensaje que yo ponia de "texto de prueva" pero el de hello Neopiro, no lo veo por mas que me esfuerce ni en el DeSmuME (emulador) ni en la consola... no se, si sabes como cambiar el color de fuente lo podria provar, pero... a no ser que tengas algun archivo que a mi me falte o algo...

si quieres subir algo... aqui se sube muy facil , sin registros ni nada y muy rapido...
http://www.ftp.nu/index.php

Gracias, siento marearte tanto...
No preguntes porque cambie una cosa antes de subirlo (bueno si lo se, confundi la macro 3D que habilita el fondo 0 por defecto).

Como bien he puesto ahi, se te olvida (y yo lo quito después de ponerlo...) poner el fondo 0 activo.

videoSetMode(MODE_5_2D| DISPLAY_BG0_ACTIVE|DISPLAY_BG2_ACTIVE);
Por fin, yo tambien puse el fond 0 activo, pero hace algunos dias, cuando aun no estaba lo otro bien, esta vez, ni se me hbia ocurrido, al no verlo puesto, creia que no habia que ponerlo. muchas gracias por todo.

Por tu paciencia y tu tiempo. Gracias
Nunca es un problema responder a lo poco de scene que tiene éste foro.
si, eso es verdad, porque en lugar de scene, deveria llamarse Hilo de Flashcards o algo asi...
20 respuestas