很抱歉耽搁了很长时间,但您的代码存在一些问题。首先是在模式 4 中,唯一可以设置为 16 位位图的背景是第 3 层。http://answers.drunkencoders.com/what-graphics-modes-does-the-ds-support/
接下来,所有图层都共享一块背景内存,而您的垃圾来自您用字体字符和控制台背景地图覆盖视频内存中的部分位图。一个简单的解决方案是通过将位图的地图基数设置为 1 来移动位图。这会将其在图形内存中偏移 16KB,从而为您的文本层留出 16KB 的空间(这只是因为我们无法在屏幕上一次显示整个 256x256 图像,因为DS 的分辨率为 256x256x2bytes 填满了所有内存条 A...更正确的是,我们应该为主背景分配另一个内存条...但是由于我们看不到底部 70 左右的像素线无论如何,图像没关系,他们没有完全进入视频内存)。
libnds 还有一个宏,可以让您更简单地为您的背景查找内存,称为“bgGetGfxPtr(id)”,它会在您设置后获得指向视频内存中背景 gfx 的指针,因此您不必尝试通过计算它BG_GFX 的偏移量。
在您的代码的所有更改中应如下所示(我在 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;
}