I'm working on a pong game for the Nintendo DS. I'm using libnds to set things up and I've come across a very strange behaviour. So far I've only tried it out in emulators, but I use three different ones and they all exhibit this behaviour so I suspect I'm doing something bad.
The actual problem is that when I use background layer 1 or above for my tiled graphics, I get weird stripes all over that layer. If I use background layer 0 the problem goes away, but since that is rendered last, I cannot actually draw over it in another layer, which I want to.
My 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 the above code I use layer 1 for bg0, which is my tiled graphics layer. This makes the weird stripes appear; if I were to change it to 0 like this, it would show up as expected:
int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);
Any ideas what causes the problem, and what the solution is?
a breif look at background.h makes it look like you are using BG1 and BG2. For mode 5, according to:
http://nocash.emubase.de/gbatek.htm
layer 0 and 1 are normal and 2 and 3 are extended. I dont know what extended means. If you want to just do normal tile stuff you probably want to bgInit 0 and 1 not 1 and 2.
You can change the priorities around at will, layer 0 is not necessarily on top of 1, etc. Look at the BGxCNT registers (BG0CNT, BG1CNT,...) and the priority bits. Now if the priority is a tie then yes the layer number determines who wins.