1

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

バックバッファ

NES には、ネームテーブルまたはバックバッファに制限がありました。私の例では、バックバッファのサイズは 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

レベル デザインもこれで表されます。各番号は異なる画面であり、- は何も意味せず、null です。

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

キャラクターの配置 これは簡単です。文字の絶対位置に基づいて、文字がどのテーブル、行、および列に基づいているかを判断する方法は既に知っています。画面内の相対的な位置も判断できます。

この情報を使用すると、文字の左右にどの列があるかを簡単に把握できます (文字が画面 1 の左側にある場合、赤は左にはありません)。

ここに質問があります DUN DUN DUN どうすれば自分のレベルを画面に描画して、あるレベルから次のレベルにスクロールできますか。一度に 1 つの画面全体を描画するのは比較的簡単で、キャラクターが端に来たら別の画面に切り替えるだけです。

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

そのため、バックバッファのスクロールを 24 ピクセル調整する必要があります。ただし、スクロールするだけで画面がオーバーラップし、レベルの古い部分が表示されます。そのため、スクロール中にレベルの新しい部分をバック バッファーに描画する必要があります。しかし、それを行う前に、最初に描画する必要があるタイルを特定する必要があります。人が左に 24 ピクセル移動した場合は、タイルをバックバッファーに再描画し、それに応じてオフセットも変更する必要があります。

また、キャラクターが右に移動し、描画するレベル データがなくなった場合、オフセットはなく、代わりにキャラクターが画面の端に近づくことを忘れないでください ( X 軸)。

基本的に、私は今、頭の中にたくさんの異なる数字と値が詰まっています. 私がこれにどのようにアプローチできるかについて、誰にも見通しがありますか?

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

4

2 に答える 2

3

NES が行った方法は、それぞれ 256x240 の 4 つの名前テーブルを使用していました。画面から1つスクロールすると、隣のものがスクロールします。512x480 より大きい「ワールド」を取得するには、画面外の位置で名前テーブルを更新します。

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

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

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

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

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

より適切にコメントされている別の分解。

編集: 上記の 2 番目の逆アセンブリでは、「SetupRoom」ルーチンと「DrawRoom」ルーチンで MetroidGameEnginePage.txt を調べます。また、ラベル LEB4D のルーチンは、あるケースで名前テーブルがどのように更新されるかを示しています。「GetNameTable」ルーチンの上にある広範なコメントも参照してください。一般に、ドキュメント全体で「名前テーブル」をテキスト検索すると、さらに多くの情報が得られます。

EDIT EDIT:romhacking.netでも。SMBのメモリ マップが役立つ場合があります。

于 2010-06-23T17:00:51.203 に答える
0

イメージ コントロールのグリッドを設定し、各画像がレベルに対して相対的な列と行を格納するデータベースからレベルを読み込みます。ゲームのキャラクターを表す画像が画面の右側に移動したら (モジュール レベルの変数に位置を保存する必要があります)、次の列の画像を読み込みます (他のすべての画像を 1 つずつシフトします)。左に移動し、最初の列を削除します)。

于 2010-06-23T00:58:09.677 に答える