Мусор в верхней части экрана при отображении текста поверх изображения в devkit pro

В настоящее время я использую 16-битный libnds (Whith devkitpro) в качестве основы и пытаюсь отобразить текст и фоновое изображение png на одном экране (в этом примере это верхний сценарий). У меня такая же проблема, как в этом посте.

У меня есть мусор в верхней части экрана (только если consoleInit(...) называется), похоже на первую проблему в потоке. Единственная проблема заключается в том, что я отображаю фоновое изображение другим способом, поэтому исправления, сделанные в этом потоке, к этому не относятся.

Все, что я ищу, - есть ли способ исправить мусор в верхней части экрана. Если есть более эффективный / лучший способ отображения изображения, я готов принять его, просто я не нашел достаточно подробного руководства о том, как загрузить изображение в качестве фона без использования этого метода. Любая помощь будет оценена. Я отвечу на любые дальнейшие вопросы, которые у кого-то есть о том, что не работает.

Вы можете найти прикрепленный проект здесь.

1 ответ

Решение

Извините за долгую задержку, но есть несколько проблем с вашим кодом. Во-первых, в режиме 4 единственным фоном, который можно настроить как 16-битное растровое изображение, является слой 3. http://answers.drunkencoders.com/what-graphics-modes-does-the-ds-support/

Затем все слои совместно используют один фрагмент фоновой памяти, и ваш мусор исходит от того, что вы перезаписываете часть растрового изображения в видеопамяти символами для шрифта и картой для фона консоли. Простое решение состоит в том, чтобы переместить растровое изображение, установив его основание карты в 1. Это смещает его в графической памяти на 16 КБ, что оставляет 16 КБ места для вашего текстового слоя (это работает только потому, что мы не можем отобразить все изображение 256x256 на экране сразу из-за разрешение DS в 256x256x2 байта заполняет весь банк памяти A... чтобы быть более точным, мы должны назначить другой банк памяти для основного фона... но так как мы не можем видеть нижние 70 или около того строк пикселей нашего Во всяком случае, это нормально, что они не попали в видеопамять).

В libnds также есть макрос для упрощения поиска памяти для вашего фона, называемый "bgGetGfxPtr(id)", который после установки установит указатель на фоновый gfx в видеопамяти, поэтому вам не придется пытаться вычислить его с помощью смещение от BG_GFX.

Все изменения в вашем коде должны выглядеть следующим образом (я добавил эту версию в faq кода libnds по адресу: http://answers.drunkencoders.com/wp-admin/post.php?post=289&action=edit&message=1)

int main(void) {


    //Top screen pic init
    videoSetMode(MODE_4_2D);
    vramSetBankA(VRAM_A_MAIN_BG);
    int bg = bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 1,0);
    decompress(drunkenlogoBitmap, bgGetGfxPtr(bg), LZ77Vram); //Displays/decompresses top image

    //videoSetMode(MODE_4_2D);
    consoleInit(0,0, BgType_Text4bpp, BgSize_T_256x256, 4,0, true, true);
    iprintf("\x1b[1;1HThe garbage is up here ^^^^^.");
    iprintf("\x1b[21;1HTesting the text function...");

    while(1) {
        swiWaitForVBlank();
        scanKeys();
        if (keysDown()&KEY_START) break;
    }
    return 0;
}
Другие вопросы по тегам