Question

Je travaille sur un jeu de pong pour la Nintendo DS. J'utilise libnds pour régler les choses et je suis venu à travers un comportement très étrange. Jusqu'à présent, je ne l'ai essayé dans émulateurs, mais j'utilise trois différents et ils présentent tous ce comportement, donc je pense que je fais quelque chose de mal.

Le problème réel est que lorsque j'utilise la couche de fond 1 ou ci-dessus pour mes graphiques carrelés, je reçois des rayures étranges partout dans cette couche. Si j'utilise la couche de fond 0 le problème disparaît, mais puisque ce dernier est rendu, je ne peux pas tirer réellement dessus dans une autre couche, que je veux.

Mon code de configuration:

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'utiliser la couche 1 pour bg0, qui est ma couche graphique en mosaïque. Cela rend les rayures étranges apparaissent; 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?

Était-ce utile?

La solution

un regard breif à background.h fait ressembler à vous utilisez BG1 et BG2. 5 Pour le mode, selon:

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

0 et une couche sont normales et 2 et 3 sont étendus. Je ne sais pas ce moyen étendu. Si vous voulez faire des choses juste de tuiles normal, vous voulez probablement bgInit 0 et 1 non 1 et 2.

Vous pouvez modifier les priorités autour de la volonté, la couche 0 est pas nécessairement au-dessus de 1, etc. Regardez les registres de BGxCNT (BG0CNT, BG1CNT, ...) et les bits de priorité. Maintenant, si la priorité est d'égalité alors oui le nombre de couche détermine qui gagne.

Autres conseils

Deux choses. D'une part, le striping est très probablement un conflit VRAM, bien qu'il a été un moment que je l'ai DS dev dernier. Double contrôle où vous copiez vos graphiques et vos données de tuiles. Mode 5 utilise deux arrière-plans de texte, qui devrait se comporter exactement la même si elles sont initialisés d'une certaine façon, donc je ne sais pas ce qui se passe là-bas.

Dans tous les cas, puisque vous avez deux arrière-plans de travail, pourquoi ne pas simplement mis leurs priorités dans leurs registres à échanger leur ordre z? Contexte ne sont tiré dans un ordre particulier par default , vous pouvez définir leur priorité pour que le système les dessiner dans l'ordre que vous souhaitez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top