遅れて申し訳ありませんが、コードにいくつか問題があります。1 つ目は、モード 4 で 16 ビット ビットマップとして設定できる唯一の背景がレイヤー 3 であることです。http://answers.drunkencoders.com/what-graphics-modes-does-the-ds-support/
次に、レイヤーはすべてバックグラウンド メモリの 1 つのチャンクを共有し、ガベージはビデオ メモリ内のビットマップの一部をフォントの文字とコンソール バックグラウンドのマップで上書きすることから発生します。簡単な解決策は、ビットマップのマップ ベースを 1 に設定してビットマップを移動することです。これにより、グラフィックス メモリが 16KB オフセットされ、テキスト レイヤー用に 16KB のスペースが確保されます (これは、256x256 の画像全体を一度に画面に表示できないためにのみ機能します)。 256x256x2 バイトの DS の解像度はメモリ バンク A のすべてを埋め尽くします...より正確には、メインの背景に別のメモリ バンクを割り当てる必要があります...しかし、私たちのとにかく、ビデオメモリに完全に収まらなかったことは問題ありません)。
libnds には、バックグラウンドのメモリを見つけるのを少し簡単にする「bgGetGfxPtr(id)」というマクロもあります。これは、設定後にビデオ メモリ内のバックグラウンド gfx へのポインタを取得するので、経由で計算する必要はありません。 BG_GFX からのオフセット。
コードへのすべての変更は次のようになります (このバージョンを libnds コード FAQ に追加しました: 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;
}