Странные полосы в плиточной графике на Nintendo DS

StackOverflow https://stackoverflow.com/questions/993922

  •  13-09-2019
  •  | 
  •  

Вопрос

Я работаю над игрой в понг для 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);

Есть идеи, что вызывает проблему и каково ее решение?

Image of weird stripes

Это было полезно?

Решение

Краткий взгляд на файл 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.Дважды проверьте, куда вы копируете графику и данные плитки.Режим 5 использует два текстовых фона, которые должны вести себя одинаково, если они инициализированы определенным образом, поэтому я не уверен, что там происходит.

В любом случае, поскольку у вас работают два фона, почему бы просто не установить их приоритеты в их регистрах, чтобы поменять их порядок z?Фон рисуется только в определенном порядке по умолчанию, вы можете установить их приоритет, чтобы система рисовала их в любом порядке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top