2009-06-14 6 views
4

Ich arbeite an einem Pong-Spiel für den Nintendo DS. Ich benutze libnds, um Dinge einzurichten, und ich bin auf ein sehr merkwürdiges Verhalten gestoßen. Bis jetzt habe ich es nur in Emulatoren ausprobiert, aber ich benutze drei verschiedene und alle zeigen dieses Verhalten, also vermute ich, dass ich etwas Schlechtes mache.Weird striping in Fliesen Grafiken auf Nintendo DS

Das eigentliche Problem ist, dass wenn ich Hintergrundschicht 1 oder höher für meine gekachelten Grafiken verwenden, bekomme ich seltsame Streifen über die ganze Schicht. Wenn ich die Hintergrundebene 0 verwende, geht das Problem weg, aber da das zuletzt gerendert wird, kann ich es tatsächlich nicht in einer anderen Ebene zeichnen, was ich möchte.

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 I-Schicht verwenden 1 für BG0, die meine geflieste Grafikschicht ist. Dies lässt die seltsamen 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); 

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

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

+0

Können Sie einen Screenshot des Striping posten? –

+0

Sicher, es ist von einem etwas veränderten Code, aber es ist mehr oder weniger dasselbe wie das, was ich beim ersten Mal bekommen habe. Meine Fliesen enthalten diese Streifen nicht. – Skurmedel

Antwort

1

ein kurzer Blick auf background.h macht es so, als ob Sie BG1 und BG2 verwenden. Für Modus 5, gemäß:

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

Schicht 0 und 1 sind normal und 2 und 3 sind ausgefahren. Ich weiß nicht, was Extended bedeutet. Wenn du nur normales Fliesenmaterial machen willst, solltest du wahrscheinlich bgInit 0 und 1 nicht 1 und 2 haben.

Du kannst die Prioritäten nach Belieben ändern, Schicht 0 steht nicht unbedingt über 1, etc. Schau dir die an BGxCNT registriert (BG0CNT, BG1CNT, ...) und die Prioritätsbits. Wenn nun die Priorität ein Gleichstand ist, dann bestimmt ja die Layernummer, wer gewinnt.

+0

Hmmm, Sie haben BG0, BG1 und BG2 aktiviert, aber nur zwei von ihnen eingerichtet. Ja? –

+0

Ja. Die BG0_ACTIVE etc scheint eigentlich nichts zu tun. – Skurmedel

+1

Das kommt definitiv von seinen Experimenten mit den Hintergründen, er hat sie wahrscheinlich alle aktiviert, aber nicht alle eingerichtet ... Moment mal, das könnte sein Problem sein. Beeindruckend. –

1

Zwei Dinge. Zum einen ist das Striping höchstwahrscheinlich ein VRAM-Konflikt, obwohl es schon eine Weile her ist, dass ich DS-Dev zuletzt gemacht habe. Überprüfen Sie, wo Sie Ihre Grafiken und Ihre Kacheldaten kopieren. Modus 5 verwendet zwei Texthintergründe, die sich genau verhalten sollten, wenn sie auf eine bestimmte Art initialisiert werden, also bin ich mir nicht sicher, was dort passiert.

In jedem Fall, da Sie zwei Hintergründe arbeiten, warum nicht einfach ihre Prioritäten in ihre Register setzen, um ihre z-Reihenfolge zu tauschen? Hintergrund wird nur in einer bestimmten Reihenfolge von Standard gezeichnet, können Sie ihre Priorität festlegen, damit das System sie in beliebiger Reihenfolge zeichnet.

+0

Oh, kannst du die Priorität manuell einstellen? Das ist sehr nützlich zu wissen. Ich werde mein VRAM überprüfen und sehen, ob es das Problem sein könnte. – Skurmedel

+0

Ich bin mir eigentlich nicht ganz sicher, ob das genau ist, ich kann mich nicht erinnern, ob der DS mit seinem 3D-Puffer Prioritäts-Macken hat, aber ich denke nicht, dass es das tut. Wie auch immer, in der Sekunde, in der du die 3D-Engine für dein erstes Pong-Spiel anschaltest, hast du bereits einen großen Fehler gemacht.^_^ –

+0

Nein, ich versuche eigentlich nicht, 3D zu machen:) ... aber vielleicht habe ich es versehentlich eingeschaltet. Ich bin ziemlich verwirrt von all diesen Schichten und ihren individuellen Einschränkungen. – Skurmedel