首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >任天堂DS上的磁贴图形出现奇怪的条纹

任天堂DS上的磁贴图形出现奇怪的条纹
EN

Stack Overflow用户
提问于 2009-06-14 22:27:31
回答 2查看 862关注 0票数 4

我在为任天堂DS开发一款乒乓球游戏。我正在使用libnds来设置东西,我遇到了一个非常奇怪的行为。到目前为止,我只在仿真器中尝试过,但我使用了三种不同的仿真器,它们都表现出了这种行为,所以我怀疑我在做一些不好的事情。

实际的问题是,当我为我的平铺图形使用背景层1或更高的时候,我得到的奇怪的条纹到处都是。如果我使用背景层0,这个问题就会消失,但因为它是最后渲染的,所以我不能在我想要的另一个层上绘制它。

我的设置代码:

代码语言:javascript
复制
void pong::setup_engine()
{
    // Setup DS graphics engine.
    // -------------------------
    videoSetMode(MODE_5_2D | DISPLAY_BG0_ACTIVE | DISPLAY_BG1_ACTIVE | DISPLAY_BG2_ACTIVE);
    vramSetBankA(VRAM_A_MAIN_BG_0x06000000);
    vramSetBankB(VRAM_B_MAIN_BG_0x06020000);

    u8 *tileMemory = reinterpret_cast<u8 *>(BG_TILE_RAM(1));
    u16 *mapMemory = reinterpret_cast<u16 *>(BG_MAP_RAM(0));

    int bg0 = bgInit(1, BgType_Text8bpp, BgSize_T_256x256, 0, 1);
    int bg1 = bgInit(2, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
    //bgScroll(bg0, 256, 256);

    u16 *ptr = bgGetGfxPtr(bg1);
    for (int y = 10; y < 128*60; y++)
    {
        ptr[y] = 0xFFFF;
    }

    BG_PALETTE[1] = grey0;
    BG_PALETTE[2] = grey1;
    BG_PALETTE[3] = grey2;
    BG_PALETTE[4] = grey3;
    BG_PALETTE[5] = grey4;
    BG_PALETTE[6] = grey5;
    BG_PALETTE[7] = grey6;

    // 32 here is not 32 bytes but 32 half-words, which is 64 bytes.
    swiCopy(CORNER_TILE, tileMemory, 32);
    swiCopy(TOP_TILE, tileMemory + 64, 32);
    swiCopy(SIDE_TILE, tileMemory + (64 * 2), 32);
    swiCopy(MAIN_TILE, tileMemory + (64 * 3), 32);

    swiCopy(MAP, mapMemory, 32*24);
}

在上面的代码中,我使用了bg0的第一层,这是我的平铺图形层。这使得奇怪的条纹出现了;如果我像这样将它改为0,它将像预期的那样显示:

代码语言:javascript
复制
int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);

你知道是什么导致了这个问题吗?解决方案是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-06-14 23:23:24

简单地看一下background.h .h,它看起来就像是在使用BG1和BG2。对于模式5,根据:

http://nocash.emubase.de/gbatek.htm

第0层和第1层正常,第2层和第3层扩展。我不知道扩展是什么意思。如果你只想做普通的瓦片,你可能想要bgInit 0和1,而不是1和2。

你可以随意改变优先级,0层不一定在1之上,等等。看看BGxCNT寄存器(BG0CNT,BG1CNT,...)和优先级位。现在,如果优先级是平局,那么是的,层数决定了谁赢了。

票数 1
EN

Stack Overflow用户

发布于 2009-06-14 22:38:44

两件事。首先,条带化最有可能是VRAM冲突,尽管我上次做DS dev已经有一段时间了。仔细检查您要将图形和磁贴数据复制到何处。模式5使用两个文本背景,如果它们以某种方式初始化,那么它们的行为应该是完全相同的,所以我不确定那里发生了什么。

在任何情况下,既然你有两个背景在工作,为什么不在它们的寄存器中设置它们的优先级来交换它们的z顺序呢?默认情况下,背景仅以特定的顺序绘制,您可以设置它们的优先级,让系统以您喜欢的任何顺序绘制它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/993922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档