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

Posted

技术标签:

【中文标题】在 devkit pro 中在图像上显示文本时屏幕顶部出现垃圾【英文标题】:Garbage on top of screen when displaying text over image in devkit pro 【发布时间】:2013-07-11 11:42:48 【问题描述】:

我目前使用 16 位 libnds(使用 devkitpro)示例作为基础,并尝试在同一屏幕上显示文本和 png 背景图像(在本示例中,它是顶部屏幕)。我遇到了与this post 类似的问题。

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

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

你可以找到项目attached here。

【问题讨论】:

简单的使用 dmacopy 显示 256x192 png 的教程就可以了。 【参考方案1】:

很抱歉耽搁了很长时间,但您的代码存在一些问题。首先是在模式 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;

【讨论】:

以上是关于在 devkit pro 中在图像上显示文本时屏幕顶部出现垃圾的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSS 在图像上重叠文本——在屏幕上有效,但在打印中无效

如何在j2me(java)中在一个屏幕中显示多个列表屏幕

如何在本机反应中在图像周围浮动文本

OpenGL:绘制二维图像的最快方法

通过整个屏幕移动文本视图

Ubuntu中Qt+opencv图像显示