在devkit pro中,在图像上显示文本时,屏幕顶部出现垃圾

Garbage on top of screen when displaying text over image in devkit pro

本文关键字:顶部 屏幕 文本 pro devkit 在图像上显示      更新时间:2023-10-16

我目前正在使用16位libnds(Whith-devkitpro)示例作为基础,并试图在同一屏幕上显示文本和png背景图像(在本示例中,它是顶部sceen)。我有一个与这篇文章类似的问题。

屏幕顶部有垃圾(仅当调用consoleInit(...)时),类似于线程中的第一个问题。唯一的问题是,我用不同的方法显示背景图像,所以他们在该线程中所做的修复不适用于此。

我只想知道是否有办法修复屏幕顶部的垃圾。如果有一种更有效/更好的方式来显示图像,我愿意接受,只是我还没有找到一个足够详细的教程,说明如何在不使用这种方法的情况下加载图像作为背景。如有任何帮助,我们将不胜感激。我会回答任何人关于什么不起作用的进一步问题。

你可以在这里找到附加的项目。

很抱歉延迟太久,但您的代码有一些问题。第一个是,在模式4中,唯一可以设置为16位位图的背景是第3层。http://answers.drunkencoders.com/what-graphics-modes-does-the-ds-support/

接下来,所有层都共享一块背景内存,而您的垃圾来自于用字体字符和控制台背景地图覆盖视频内存中的位图部分。一个简单的解决方案是通过将位图的贴图基础设置为1来移动位图。这将其图形内存偏移16KB,为文本层留出16KB的空间(这只是因为我们不能同时在屏幕上显示整个256x256图像,因为256x256x2字节的DS的分辨率填满了所有的内存组A……为了更正确,我们应该将另一个内存组分配给主背景……但由于我们无论如何都看不到图像的底部70行左右的像素,它们没有完全进入视频内存也没关系)。

libnds还有一个名为"bgGetGfxPtr(id)"的宏,可以让为背景查找内存变得更简单,它将在您设置后在视频内存中获得一个指向背景gfx的指针,这样您就不必试图通过BG_gfx的偏移量来计算它。

在所有对代码的更改中,应该是这样的(我在以下位置向libnds代码faq添加了一个版本:http://answers.drunkencoders.com/wp-admin/post.php?post=289&action=edit&消息=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;
}