我工作的一个乒乓球比赛的任天堂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);

任何想法是什么原因导致的问题,解决的办法是什么?

“怪异条纹图像”

有帮助吗?

解决方案

一breif看看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,...)和优先级位。现在,如果优先级是一条领带然后是层编号确定谁赢得。

其他提示

两件事情。其一,分拆是最有可能是VRAM冲突,尽管它一直以来我所做的DS dev的最后一段时间。仔细检查你在哪里复制你的显卡和你的瓦片数据。模式5使用了两个文本的背景,如果他们初始化,以一定的方式应表现完全一样的,所以我不知道发生了什么事情在那里。

在任何情况下,因为你有两个背景的工作,为什么不设置优先级,在他们的寄存器交换他们的Z顺序?背景只能通过以特定顺序绘制的默认的,你可以设置自己的优先级,让系统吸引他们在你喜欢的任何顺序。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top