4

ニンテンドーDS用のポンゲームに取り組んでいます。私はlibndsを使用して設定を行っていますが、非常に奇妙な動作に遭遇しました。これまでエミュレーターで試しただけですが、3つの異なるエミュレーターを使用しており、それらはすべてこの動作を示しているため、何か悪いことをしているのではないかと思います。

実際の問題は、タイルグラフィックに背景レイヤー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);
}

上記のコードでは、タイルグラフィックレイヤーであるbg0にレイヤー1を使用しています。これにより、奇妙な縞模様が現れます。このように0に変更すると、期待どおりに表示されます。

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

問題の原因と解決策は何ですか?

奇妙な縞模様の画像

4

2 に答える 2

1

2つのこと。1つは、最後にDS devを実行してからしばらく経ちましたが、ストライピングはVRAMの競合である可能性が高いです。グラフィックとタイルデータをコピーする場所を再確認してください。モード5は2つのテキスト背景を使用しますが、特定の方法で初期化された場合はまったく同じように動作するはずなので、そこで何が起こっているのかわかりません。

いずれにせよ、2つのバックグラウンドが機能しているので、レジスタに優先順位を設定してzオーダーを入れ替えてみませんか?背景はデフォルトで特定の順序でのみ描画されます。優先度を設定して、システムに任意の順序で背景を描画させることができます。

于 2009-06-14T22:38:44.430 に答える
1

background.hを簡単に見ると、BG1とBG2を使用しているように見えます。モード5の場合、次のようになります。

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

レイヤー0と1は正常で、2と3は拡張されています。拡張の意味がわかりません。通常のタイル処理を実行したい場合は、1と2ではなくbgInit0と1を使用することをお勧めします。

優先順位は自由に変更できます。レイヤー0は必ずしも1の上にあるとは限りません。BGxCNTレジスタ(BG0CNT、BG1CNTなど)と優先順位ビットを確認してください。優先順位が同点の場合、はい、レイヤー番号によって誰が勝つかが決まります。

于 2009-06-14T23:23:23.823 に答える