2009-06-14 11 views
4

Je travaille sur un jeu de pong pour la Nintendo DS. J'utilise libnds pour mettre les choses en place et j'ai rencontré un comportement très étrange. Jusqu'à présent, je ne l'ai essayé que dans des émulateurs, mais j'en utilise trois différents et ils montrent tous ce comportement, donc je pense que je fais quelque chose de mal. Le problème réel est que lorsque j'utilise le calque de fond 1 ou supérieur pour mes graphiques en mosaïque, j'obtiens des rayures étranges partout sur ce calque. Si j'utilise le calque d'arrière-plan 0, le problème disparaît, mais puisque cela est rendu en dernier, je ne peux pas le dessiner dans un autre calque, ce que je veux.Bizarre striping dans les graphiques de carrelage sur Nintendo DS

Mon code d'installation:

void pong::setup_engine() 
{ 
    // Setup DS graphics engine. 
    // ------------------------- 
    videoSetMode(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE); 
    vramSetBankA(VRAM_A_MAIN_BG_0x06000000); 
    vramSetBankB(VRAM_B_MAIN_BG_0x06020000); 

    u8 *tileMemory = reinterpret_cast<u8 *>(BG_TILE_RAM(1)); 
    u16 *mapMemory = reinterpret_cast<u16 *>(BG_MAP_RAM(0)); 

    int bg0 = bgInit(1, BgType_Text8bpp, BgSize_T_256x256, 0, 1); 
    int bg1 = bgInit(2, BgType_Bmp16, BgSize_B16_256x256, 0, 0); 
    //bgScroll(bg0, 256, 256); 

    u16 *ptr = bgGetGfxPtr(bg1); 
    for (int y = 10; y < 128*60; y++) 
    { 
     ptr[y] = 0xFFFF; 
    } 

    BG_PALETTE[1] = grey0; 
    BG_PALETTE[2] = grey1; 
    BG_PALETTE[3] = grey2; 
    BG_PALETTE[4] = grey3; 
    BG_PALETTE[5] = grey4; 
    BG_PALETTE[6] = grey5; 
    BG_PALETTE[7] = grey6; 

    // 32 here is not 32 bytes but 32 half-words, which is 64 bytes. 
    swiCopy(CORNER_TILE, tileMemory, 32); 
    swiCopy(TOP_TILE, tileMemory + 64, 32); 
    swiCopy(SIDE_TILE, tileMemory + (64 * 2), 32); 
    swiCopy(MAIN_TILE, tileMemory + (64 * 3), 32); 

    swiCopy(MAP, mapMemory, 32*24); 
} 

Dans le code ci-dessus j'utilise la couche 1 pour bg0, qui est ma couche graphique en mosaïque. Cela fait apparaître les bandes étranges; si je devais changer à 0 comme ça, il apparaîtrait comme prévu:

int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1); 

Toutes les idées que la cause du problème, et quelle est la solution?

Image of weird stripes http://i41.tinypic.com/1oaern.png

+0

Pouvez-vous poster une capture d'écran de la rayure? –

+0

Bien sûr, il s'agit d'un code légèrement modifié, mais c'est plus ou moins la même chose que ce que j'ai obtenu la première fois. Mes carreaux ne contiennent pas ces rayures. – Skurmedel

Répondre

1

Un bref aperçu de background.h donne l'impression que vous utilisez BG1 et BG2. 5 Pour le mode, selon:

http://nocash.emubase.de/gbatek.htm

couche 0 et 1 sont normales et 2 et 3 sont étendus. Je ne sais pas ce que cela signifie. Si vous voulez simplement faire des trucs de tuiles normales, vous voulez probablement bgInit 0 et 1 et pas 1 et 2.

Vous pouvez changer les priorités à volonté, la couche 0 n'est pas nécessairement au-dessus de 1, etc. BGxCNT enregistre (BG0CNT, BG1CNT, ...) et les bits de priorité. Maintenant, si la priorité est une égalité alors oui, le numéro de la couche détermine qui gagne.

+0

Hmmm, vous avez activé BG0, BG1 et BG2 mais n'en avez configuré que deux. Oui? –

+0

Oui. Le BG0_ACTIVE etc ne semble pas réellement faire quoi que ce soit. – Skurmedel

+1

Cela découle certainement de son expérimentation avec les arrière-plans, il les a probablement tous activés mais pas tous mis en place ... Attendez une seconde, ce qui pourrait bien être son problème. Sensationnel. –

1

Deux choses. Pour un, le striping est très probablement un conflit VRAM, même si cela fait longtemps que je n'ai pas fait DS dev. Vérifiez à nouveau où vous copiez vos graphiques et vos données de tuiles. Le mode 5 utilise deux arrière-plans de texte, qui devraient se comporter exactement de la même façon s'ils sont initialisés d'une certaine manière, donc je ne suis pas sûr de ce qui se passe là-bas.

Dans tous les cas, puisque vous avez deux arrière-plans qui fonctionnent, pourquoi ne pas simplement définir leurs priorités dans leurs registres pour échanger leur ordre z? Les arrière-plans ne sont dessinés que dans un ordre particulier par par défaut, vous pouvez définir leur priorité pour que le système les dessine dans l'ordre que vous voulez.

+0

Oh, vous pouvez définir la priorité manuellement? C'est très utile à savoir. Je vais vérifier ma VRAM et voir si c'est peut-être le problème. – Skurmedel

+0

Je ne suis pas tout à fait sûr que c'est exact, je ne me souviens pas si la DS a des défauts de priorité avec son tampon 3D, mais je ne pense pas que ce soit le cas. En tout cas, à la seconde où vous allumez le moteur 3D pour votre premier jeu de pong, vous avez déjà fait une grosse erreur.^_^ –

+0

Non, je n'essaie pas de faire 3D:) ... mais peut-être que j'ai accidentellement allumé. Je suis assez confus par toutes ces couches et leurs limites individuelles. – Skurmedel