Bug sur chargement d'une map

Démarré par EvilTroopa, 05 Juillet 2012 à 17:00:32

« précédent - suivant »

0 Membres et 1 Invité sur ce sujet

EvilTroopa

C'est le moment d'inaugurer ce forum :D

J'ai créé une map :


Voila ce que ça donne sur émulateur :


Comme on peut le voir, en haut j'ai une bande noire qui apparait. Je ne vois pas d'o? ça peut venir...
De m?me pour le bas de l'écran j'ai 2 pixels noirs constamment en bas sur ZNES et un peu plus sur NO$SNS (apparemment l'écran est plus haut sur cet émulateur).
Voila le code qui initialise mon BG :

// Initialize SNES
consoleInit();

// Initialize text console with our font
consoleInitText(0, 1, &font);

// Now Put in 16 color mode and disable Bgs except current
setMode(BG_MODE1, 0);  bgSetDisable(2);

// Copy tiles to VRAM
bgInitTileSet(1, &bg1, &bg1pal, 0, (&bg1_end - &bg1), 16*2, BG_16COLORS, 0x5000);

// Init Map to address 0x1000 and Copy Map to VRAM
bgSetMapPtr(1, 0x1000, SC_64x64);
for(i = 0; i < 64; i++){
u8 *ptrMap  = &bg1map + 64*i*2; // 64 = map size x *2 because each entry is 16bits length
//if (i >= 16) ptrMap  = &bg1map + 32*5*2; // Init anything else with white line <= WTF ?
u16 ptrVRAM = 0x1000 + i * 64; // screen begin at 0x1000
dmaCopyVram(ptrMap, ptrVRAM, 64*2); // copy row to VRAM
dmaCopyVram((ptrMap+64*2), (ptrVRAM+64*64), 64*2); // copy row to VRAM
}

J'ai repris le code de l'exemple mariolike, mais je n'ai pas bien saisi la ligne commentée (d'o? le "WTF").

Le débug affiche pad0 et le scroll X et Y.

Une idée ?

Edit : je note d'ailleurs que par rapport ? l'image le scroll est décalé... Je suppose que ça confirme qu'il y a un probl?me dans l'initialisation du BG...

alekmaul

Alors, premi?re petite réponse par rapport ? tes questions :
Citation//if (i >= 16) ptrMap  = &bg1map + 32*5*2; // Init anything else with white line <= WTF ?
Tout simplement que la map de mario ets plus petite que l'écran de la SNES? j'init donc avec rien le bas de l'écran.

Pour les lignes noirs, je pense que cela vient d'un probl?me de VBL, peux tu me dire ce que tu as exactement dans la boucle principale de ton programme et aussi ? quel moment tu déclenches la synchro VBL avec WaitForVBlank();

As tu testé sur bsnes, bien qu'il soit lent, c'est le plus proche de la SNES réélle ?

EvilTroopa

Voila ce qu'il y a dans ma boucle principale :

while(1) {

scanPads();
pad0 = padsCurrent(0);

move = 0;

if(pad0 & KEY_RIGHT){
++scrollX;
move = 1;
dir = 1;
}
if(pad0 & KEY_LEFT){
--scrollX;
move = 1;
dir = 3;
}

if(pad0 & KEY_UP){
--scrollY;
move = 1;
dir = 0;
}
if(pad0 & KEY_DOWN){
++scrollY;
move = 1;
dir = 2;
}

if(move == 1){
++animFrame;
animFrame &= 31;
}else{
animFrame = 0;
}

flipX = 0;
if(dir == 3) flipX = 1;

oamSet(0, posX, posY, 2, flipX, 0, animFrames[dir * 4 + (animFrame >> 3)], 0);

keepScrollInRange();

bgSetScroll(1, scrollX, scrollY);

consoleDrawText(0, 1, "%04u - %05u, %05u", pad0, scrollX, scrollY);


WaitForVBlank();
++iFrame;

}


Pour info, si retire tout sauf le VBL de ma boucle, j'ai quand m?me le probl?me.

J'ai testé de faire un autre projet avec un fond plus petit (256x256) j'ai toujours le m?me probl?me. Je l'ai mis en PJ de ce post.
Ha ben non... "Impossible d'accéder au chemin des fichiers joints !"

Je viens de lancer bsnes mais il ne semble pas marcher sur mon pc portable "Failed to initialise video driver". Je testerai sur mon PC de bureau plus tard.

alekmaul

#3
Bon, j'ai modifié un tout petit peu l'init dans ton code car l'affichage ne se faisait pas.
Il faut en effet attendre une VBL pour mettre ? jour la VRAM (cf le code de Mario ?u je mets ? jour lors du scroll la derni?re ligne de l'écran.
Ce qui donne cela :

extern char bg1, bg1_end, font;
extern char bg1pal, bg1pal_end;
extern char bg1map, bg1map_end;

unsigned char i,move,dir,flipX,animFrame,iFrame;
unsigned short scrollX=0,scrollY=0,pad0;

//---------------------------------------------------------------------------------
int main(void) {
// Initialize SNES
consoleInit();

// Initialize text console with our font
consoleInitText(0, 1, &font);

// Now Put in 16 color mode and disable Bgs except current
setMode(BG_MODE1, 0);  bgSetDisable(2);

// Copy tiles to VRAM
bgInitTileSet(1, &bg1, &bg1pal, 0, (&bg1_end - &bg1), 16*2, BG_16COLORS, 0x5000);

// Init Map to address 0x1000 and Copy Map to VRAM
bgSetMapPtr(1, 0x1000, SC_64x64);
u8 *ptrMap  = &bg1map; // 64 = map size x *2 because each entry is 16bits length
u16 ptrVRAM = 0x1000; // screen begin at 0x1000
for(i = 0; i < 64; i++){
WaitVBLFlag;
dmaCopyVram(ptrMap, ptrVRAM, 64*2); // copy row to VRAM
dmaCopyVram((ptrMap+64*2), (ptrVRAM+64*64), 64*2); // copy row to VRAM
ptrMap += 64*2;
ptrVRAM += 64;
}

// Wait for nothing :P
while(1) {
scanPads();
pad0 = padsCurrent(0);

move = 0;

if(pad0 & KEY_RIGHT){
++scrollX;
move = 1;
dir = 1;
}
if(pad0 & KEY_LEFT){
--scrollX;
move = 1;
dir = 3;
}

if(pad0 & KEY_UP){
--scrollY;
move = 1;
dir = 0;
}
if(pad0 & KEY_DOWN){
++scrollY;
move = 1;
dir = 2;
}

if(move == 1){
++animFrame;
animFrame &= 31;
}else{
animFrame = 0;
}

flipX = 0;
if(dir == 3) flipX = 1;

//oamSet(0, posX, posY, 2, flipX, 0, animFrames[dir * 4 + (animFrame >> 3)], 0);

//keepScrollInRange();

bgSetScroll(1, scrollX, scrollY);

consoleDrawText(0, 1, "%04u - %05u, %05u", pad0, scrollX, scrollY);

WaitForVBlank();
++iFrame;
}
return 0;
}


Et je n'ai pas le pb de ligne noir dans no$sns ... Tu as quelle version ? Peut ?tre que ton PC n'est pas assez puissant ou que tu as un pb graphique comme avec bsnes ...
Pour zsnes1.51, j'ai le pb, impossible de comprendre pourquoi ...

Sinon, j'ai rétabli la possibilité de mettre des fichiers joints, smf avant pourri le répertoire des attachements ... Attention, on ne les voit qui si on est identifié sur le forum.