Странные полосы в плитке на Nintendo DS
Я работаю над игрой понг для Nintendo DS. Я использую libnds для настройки, и я столкнулся с очень странным поведением. До сих пор я пробовал это только в эмуляторах, но я использую три разных, и все они демонстрируют такое поведение, поэтому я подозреваю, что я делаю что-то плохое.
Фактическая проблема заключается в том, что когда я использую фоновый слой 1 или выше для мозаичной графики, я получаю странные полосы по всему слою. Если я использую фоновый слой 0, проблема исчезнет, но, поскольку он отображается последним, я не смогу нарисовать его в другом слое, который я хочу.
Мой установочный код:
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);
}
В приведенном выше коде я использую слой 1 для bg0, который является моим мозаичным графическим слоем. Это заставляет странные полосы появляться; если бы я изменил его на 0, как это, он будет отображаться как ожидалось:
int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);
Есть идеи, что вызывает проблему, и каково ее решение?
2 ответа
Краткий взгляд на background.h показывает, что вы используете BG1 и BG2. Для режима 5 согласно:
http://nocash.emubase.de/gbatek.htm
Слои 0 и 1 нормальны, а 2 и 3 расширены. Я не знаю, что означает расширенный. Если вы хотите просто выполнять обычные операции с плитками, вы, вероятно, захотите bgInit 0 и 1, а не 1 и 2.
Вы можете изменить приоритеты по желанию, уровень 0 не обязательно должен быть поверх 1 и т. Д. Посмотрите регистры BGxCNT (BG0CNT, BG1CNT,...) и биты приоритетов. Теперь, если приоритет - ничья, тогда номер слоя определяет, кто победит.
Две вещи. С одной стороны, чередование, скорее всего, является конфликтом VRAM, хотя прошло уже много времени с тех пор, как я в последний раз делал DS dev. Дважды проверьте, где вы копируете свою графику и данные плитки. В режиме 5 используются два текстовых фона, которые должны вести себя точно так же, если они инициализируются определенным образом, поэтому я не уверен, что там происходит.
В любом случае, поскольку у вас работают два фона, почему бы просто не установить их приоритеты в своих регистрах, чтобы поменять местами их z-порядок? Фон по умолчанию рисуется только в определенном порядке, вы можете установить их приоритет, чтобы система рисовала их в любом порядке.