2009-06-14 6 views
4

私は任天堂DS用のポンゲームに取り組んでいます。私は物事を設定するためにlibndsを使用しています、私は非常に奇妙な動作に出くわしました。これまで私はエミュレータで試してみましたが、3つの異なるものを使用しています。これらはすべてこの動作を示していますので、私は何か悪いことをしていると思います。ニンテンドーDSでのタイルグラフィックスの奇妙なストライピング

実際の問題は、タイル張りのグラフィックスに背景レイヤー1以上を使用すると、そのレイヤー全体に奇妙な縞ができてしまうことです。背景レイヤー0を使用すると問題は解決しますが、最後にレンダリングされるので、実際に別のレイヤーに描画することはできません。

マイセットアップコード:私のタイル張りのグラフィック層である私はBG0のためのレイヤ1を使用し、上記のコードでは、

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

。これにより、奇妙な縞模様が現れます。

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

問題を引き起こす原因は何か、その解決策は何ですか?

Image of weird stripes http://i41.tinypic.com/1oaern.png

+0

ストライピングのスクリーンショットを投稿できますか? –

+0

確かに、それは若干変更されたコードからのものですが、最初のものとほぼ同じです。私のタイルはこれらの縞模様を含んでいません。 – Skurmedel

答えて

1

BG1とBG2を使用しているように見えるのは、background.hを見てください。モード5のために記載:

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

レイヤ0及び1が正常であると2と3拡張されます。私は拡張された手段を知っていません。通常のタイルを使用する場合は、おそらくbgInit 0と1には1と2以外の値を設定することをお勧めします。

優先度を自由に変更できます。レイヤー0は必ずしも1の上にはありません。 BGxCNTレジスタ(BG0CNT、BG1CNT、...)および優先順位ビット。今度は優先順位がネクタイであれば、層番号が勝者を決定します。

+0

ええとBG0、BG1、BG2は有効になっていますが、2つしか設定できません。はい? –

+0

うん。 BG0_ACTIVEなどは実際に何もしないようです。 – Skurmedel

+1

これは間違いなく、彼が背景を使って実験したことに由来しています。おそらくすべてが有効になっていますが、すべて設定されているわけではありません。ワオ。 –

1

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

いずれの場合でも、2つのバックグラウンドが働いているので、レジスタに優先順位を設定してzオーダーを入れ替えるのはなぜですか?背景はデフォルトので特定の順序でのみ描画されます。優先順位は、好きな順序で描画するように設定することができます。

+0

ああ、手動で優先度を設定できますか?それは知っていると非常に便利です。私は行くし、私のVRAMをチェックし、それが問題かもしれないかどうかを確認します。 – Skurmedel

+0

私は確かにそれが正確であるかどうかは十分にはわかりませんが、DSに3Dバッファの優先順位があるかどうかはわかりませんが、そうは思いません。いずれにしても、最初のポンゲームで3Dエンジンをオンにすると、すでに大きなミスを犯しています。^_^ –

+0

いいえ私は実際に3Dをやろうとしていません:)...しかし多分私はそれを偶然オンにしました。私はこれらすべての層とその個々の限界によってかなり混乱しています。 – Skurmedel