1

現在、16 ビットの libnds (With devkitpro) の例をベースとして使用しており、テキストと png 背景画像を同じ画面 (この例ではトップ画面) に表示しようとしています。この投稿と同様の問題があります。

consoleInit(...)スレッドの最初の問題と同様に、画面の上部にゴミがあります (が呼び出された場合のみ)。唯一の問題は、背景画像を別の方法で表示しているため、そのスレッドで行った修正がこれに適用されなかったことです。

私が探しているのは、画面上部のゴミを修正する方法があるかどうかだけです。画像を表示するためのより効率的/より良い方法がある場合は、喜んで受け入れますが、この方法を使用せずに画像を背景として読み込む方法についての十分に詳細なチュートリアルが見つかりませんでした。どんな助けでも大歓迎です。何が機能していないかについて、誰かが持っているさらなる質問に答えます。

ここに添付されているプロジェクトを見つけることができます。

4

1 に答える 1

2

遅れて申し訳ありませんが、コードにいくつか問題があります。1 つ目は、モード 4 で 16 ビット ビットマップとして設定できる唯一の背景がレイヤー 3 であることです。http://answers.drunkencoders.com/what-graphics-modes-does-the-ds-support/

次に、レイヤーはすべてバックグラウンド メモリの 1 つのチャンクを共有し、ガベージはビデオ メモリ内のビットマップの一部をフォントの文字とコンソール バックグラウンドのマップで上書きすることから発生します。簡単な解決策は、ビットマップのマップ ベースを 1 に設定してビットマップを移動することです。これにより、グラフィックス メモリが 16KB オフセットされ、テキスト レイヤー用に 16KB のスペースが確保されます (これは、256x256 の画像全体を一度に画面に表示できないためにのみ機能します)。 256x256x2 バイトの DS の解像度はメモリ バンク A のすべてを埋め尽くします...より正確には、メインの背景に別のメモリ バンクを割り当てる必要があります...しかし、私たちのとにかく、ビデオメモリに完全に収まらなかったことは問題ありません)。

libnds には、バックグラウンドのメモリを見つけるのを少し簡単にする「bgGetGfxPtr(id)」というマクロもあります。これは、設定後にビデオ メモリ内のバックグラウンド gfx へのポインタを取得するので、経由で計算する必要はありません。 BG_GFX からのオフセット。

コードへのすべての変更は次のようになります (このバージョンを libnds コード FAQ に追加しました: 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;
}
于 2013-08-24T15:58:02.110 に答える