ゲームで2Dマップをレンダリングする - トリミングとスクロール

StackOverflow https://stackoverflow.com/questions/3088687

  •  28-09-2019
  •  | 
  •  

質問

わかった。私はNESハードウェアを自分で解釈しようとしているので、NESゲームがどのように見えるかに似たゲームを作成できます。現在、プレイフィールドをビデオメモリ(バックバッファー)に描く方法を調整する方法に固執しています。

バックバッファ

NESには、namaTableまたはバックバッファーに制限がありました。私の例では、バックバッファーは大きく256x240ピクセル、または1つの画面のサイズです。これをテレビに描いた場合、画面が完全にいっぱいになります。これで、x = 5のオフセットでこれを画面に描いた場合、画像全体がシフトされ、画面の周りに巻き付けられます。

例えば.....

ORIGINAL, NO OFFSET:                      DRAWN WITH OFFSET OF X=5:
ABCDEFGHIJK                               GHIJKABCDEF

DRAWN WITH OFFSET OF X=-5:
FGHIJKABCDE

画面はそれぞれ8x8ピクセルの正方形に分割され、合計32x30行と列があります。 (256x240ピクセル)。オフセットは、列ではなくピクセルで表されます。そのため、理論的には、画面を5ピクセル単位でオフセットすることができ、すべての列が5ピクセル右にシフトされます。

レベルの設計

私のステージは、16x15行と列に表されるデータを含む画面で構成されており、それぞれ16x16ピクセルです。これは、NESゲームの保存レベルデータの数をエミュレートするためです。各タイルは、各8x8ブロックに何があるかについての情報を保持しています。

例えば:

AA
BC     with A,B,C,D representing what 8x8 graphic should go where

レベルのデザインもこれで表され、各数値は異なる画面であり、何も意味がありません。

-----
-123-
---4-
--54-
-----

キャラクターの配置これは簡単。私は、私のキャラクターが絶対的な位置付けに基づいて、どのテーブル、列、列を列にしているかをどのように決定できるかをすでに知っています。画面内の相対的な位置を決定することもできます。

この情報を使用すると、キャラクターの左右にどの列が左右にあるかを簡単に把握できます(キャラクターが画面1の左側にある場合、左のレベルはもうありません)

Dun Dun Dunの質問は次のとおりですレベルを画面に引き込むにはどうすればよいですか。一度に1つのフル画面を1つずつ描画するのは比較的簡単で、キャラクターがエッジに到達したら、別の画面にひっくり返します。

ただし、私が概念的に抱えている問題は、レベルデータを画面に「ストリーミング」する必要があることです。それは、キャラクターが右に24ピクセルを移動するとしましょう。 BGも移動する必要があります。

そのため、バックバッファのスクロールを24ピクセル調整する必要があります。ただし、単独でスクロールするだけで、画面が包み込まれ、レベルの古い部分が登場します。したがって、スクロール中は、バックバッファーに新しいレベルの新しいピースを必ず描く必要があります。しかし、それを行う前に、最初にどのタイルを描画する必要があるかを把握する必要があります。そして、その人が左に24ピクセルになった場合、タイルをバックバッファに再描画し、それに応じてオフセットを変更する必要があります。

そして、文字が右に移動し、描画するレベルデータがもうない場合、オフセットはないはずですが、代わりにキャラクターが画面の側面に近づくことを忘れないでください(画面の中央にある代わりに、画面の中央にあります。 x軸)。

基本的に、私は今、多くの異なる数字と価値を私の心に閉じ込めているだけです - 私の頭を多くの概念に巻き込もうとしています、そして、彼らは私の脳をグーに変えました。誰かが私がこれにどのようにアプローチできるかについて何か視点を持っていますか?

編集:VB.NETを使用します。 C#も適用可能です(両方でプログラムします)

役に立ちましたか?

解決

NESのやり方は、それぞれ256x240の4つの名前テーブルを使用しました。画面から1つをスクロールすると、隣接するものがスクロールします。 512x480を超える「世界」を取得するには、オフスクリーンの位置で名前テーブルを更新します。

一般に、カートリッジにはすべてのレベルデータを含むROMに巨大なテーブルがあり、1つまたは2つのRAM変数で全体的な位置を追跡します。次に、ゲームがスクロールすると、RAM変数が更新され、それらを使用してレベルデータテーブルを検索し、新しいレベルデータをコピーして、スクリーンのオフスクリーンの名前テーブルの部分にコピーします。

したがって、実際には、バックバッファーは512x480である必要があり、その256x240の部分のみが表示されます。

スクロールの世界が大きいNESゲームの分解を見たことがありますか?メトロイドの部分的な分解がどこかにあると思います...

...ええ、いくつかのドキュメントを見つけました romhacking.net

メトロイドの分解;よくコメントしていませんが、少しの努力があれば、それを理解するのはそれほど難しくないはずです。

別の分解 それはよりよくコメントされています。

編集:上に掲載されている2番目の分解では、「セットアップルーム」ルーチンと「ドローーム」ルーチンのMetroidGameEnginePage.txtをご覧ください。また、ラベルLeb4Dのルーチンは、1つのケースで名前テーブルがどのように更新されるかを示しています。また、「GetNametable」ルーチンの上の広範なコメントをご覧ください。一般に、ドキュメント全体で「名前テーブル」をテキスト検索すると、さらに多くのテキストが得られます。

編集編集:romhacking.netでも。 SMBのメモリマップ 便利かもしれません。

他のヒント

画像コントロールのグリッドをセットアップし、各画像がレベルに対してどの列と列を保存するかを保存するデータベースからレベルをロードします。ゲームのキャラクターを表す画像が、画面の右に十分に伸びると(いくつかのモジュールレベル変数にその場所を保存する必要があります)、次の画像の列をロードします(他のすべての画像をすべてにシフトします。最初の列を左に削除します)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top