任天堂DS上的瓷砖图形奇怪的条纹

问题描述 投票:4回答:2

我正在为Nintendo DS做一个乒乓球比赛。我正在使用libnds进行设置,我遇到了一种非常奇怪的行为。到目前为止,我只是在模拟器中尝试过,但是我使用了三种不同的模式,它们都表现出这种行为,所以我怀疑我做的很糟糕。

实际的问题是,当我使用背景图层1或更高的平铺图形时,我会在整个图层上看到奇怪的条纹。如果我使用背景层0,问题就会消失,但由于这是最后渲染的,我实际上无法在另一层中绘制它,我想要。

我的设置代码:

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);
}

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

int bg0 = bgInit(0, BgType_Text8bpp, BgSize_T_256x256, 0, 1);

任何想法导致问题的原因,以及解决方案是什么?

Image of weird stripes

c++ arm nintendo-ds libnds
2个回答
1
投票

简要介绍一下background.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
投票

两件事情。首先,条带化很可能是VRAM冲突,虽然距离DS dev最后一段时间已经有一段时间了。仔细检查您复制图形和平铺数据的位置。模式5使用两个文本背景,如果它们以某种方式初始化应该表现完全相同,所以我不确定那里发生了什么。

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

© www.soinside.com 2019 - 2024. All rights reserved.