Domanda

Sto lavorando su un gioco pong per Nintendo DS. Sto usando libnds per impostare le cose e ho incontrato un comportamento molto strano. Finora ho provato solo fuori in emulatori, ma io uso tre diversi e tutti presentano questo comportamento così ho il sospetto che sto facendo qualcosa di male.

Il problema reale è che quando uso livello di sfondo 1 o superiore per la mia grafica piastrellati, ottengo strisce strani tutto quello strato. Se uso livello di sfondo 0 il problema scompare, ma dal momento che è resa ultima, non può effettivamente disegnare su di esso in un altro strato, che voglio.

Il mio codice di installazione:

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);
}

Nel codice di cui sopra ho Usa livello 1 per BG0, che è il mio livello grafico piastrelle. Questo rende appaiono le strisce strane; se dovessi cambiare a 0 in questo modo, si rivelerebbe come previsto:

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

Tutte le idee che causa il problema, e quale sia la soluzione?

Immagine di strisce strane

È stato utile?

Soluzione

uno sguardo al breif background.h lo fa apparire come si sta utilizzando BG1 e BG2. Per la modalità 5, in base a:

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

strato 0 e 1 sono normali e 2 e 3 sono estese. Non so che cosa esteso mezzi. Se si vuole solo fare cose tegola normale probabilmente si desidera bgInit 0 e non 1 1 e 2.

È possibile cambiare le priorità a piacimento, livello 0 non è necessariamente in cima 1, ecc Guardate registri BGxCNT (BG0CNT, BG1CNT, ...) ei bit di priorità. Ora, se la priorità è un pareggio allora sì il numero livello determina chi vince.

Altri suggerimenti

Due cose. Per uno, lo striping è più probabile un conflitto di VRAM, anche se è stato un po 'che ho fatto DS DEV scorso. Doppio controllo dove si sta copiando la grafica ei dati di piastrelle. Modalità 5 utilizza due ambiti di testo, che dovrebbe comportarsi esattamente lo stesso se sono inizializzati in un certo modo, quindi non sono sicuro di quello che sta succedendo lì.

In ogni caso, dal momento che si dispone di due ambiti di lavoro, perché non è sufficiente impostare le priorità nei loro registri di scambiare la loro ordine z? Sfondo sono disegnati solo in un particolare ordine da default , è possibile impostare la loro priorità per avere il sistema li disegnare in qualsiasi ordine che ti piace.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top