Frage

Ich arbeite an einem Pong-Spiel für den Nintendo DS. Ich verwende libnds alles einzurichten und ich habe über ein sehr seltsames Verhalten kommen. Bisher habe ich versucht, es nur in Emulatoren, aber ich verwende drei verschiedene, und sie alle zeigen dieses Verhalten so vermute ich, dass ich etwas Schlimmes mache.

Das eigentliche Problem ist, dass, wenn ich Hintergrundebene 1 oder höher für meine gefliesten Grafiken verwenden, ich seltsam Streife ganzes dieser Schicht erhalten. Wenn ich Hintergrundebene 0 das Problem verwenden geht weg, aber da die letzten wiedergegeben wird, kann ich nicht wirklich über sie in einer anderen Schicht zeichnen, was ich will.

Mein Setup-Code:

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

In dem obigen Code verwende ich Schicht 1 für BG0, die Schicht meiner gefliest Grafiken. Dies macht die seltsame Streifen erscheinen; wenn ich es auf 0, so zu ändern, würde es zeigen sich wie erwartet:

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

Alle Ideen, was das Problem verursacht, und was ist die Lösung?

War es hilfreich?

Lösung

ein breif Blick auf background.h macht es so aussehen wie Sie BG1 und BG2 verwenden. Für Modus 5, nach:

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

Ebene 0 und 1 sind normal und 2 und 3 sind ausgefahren. Ich weiß nicht, was Mittel erweitert. Wenn Sie wollen einfach nur normale Fliese Sachen tun möchten Sie wahrscheinlich 0 und 1 nicht 1 und 2 bis bgInit.

Sie können die Prioritäten um nach Belieben ändern, Ebene 0 ist nicht unbedingt oben auf 1 usw. Schauen Sie sich die BGxCNT Register (BG0CNT, BG1CNT, ...) und die Priorität Bits. Wenn nun die Priorität eine Krawatte dann ist ja die Schichtnummer bestimmt, wer gewinnt.

Andere Tipps

Zwei Dinge. Zum einen ist das Striping höchstwahrscheinlich ein VRAM Konflikt, obwohl es schon eine Weile her, seit ich habe DS letzten dev. Überprüfen Sie, wo Sie Ihre Grafiken und Ihre Fliesen Daten sind zu kopieren. Mode 5 verwendet zwei Texthintergründe, die exakt verhalten sollten die gleichen, wenn sie eine bestimmte Art und Weise initialisiert sind, also bin ich nicht sicher, was dort vor sich geht.

Auf jeden Fall, denn Sie haben zwei Hintergründen arbeiten, warum nicht nur ihre Prioritäten in ihren Registern ihre z, um zu tauschen? Hintergrund ist nur in einer bestimmten Reihenfolge gezeichnet von default können Sie ihre Priorität gesetzt das System zu haben, sie in beliebiger Reihenfolge ziehen Sie mögen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top