9

私は現在、C# で、基本的に私が開発している昔ながらの見た目のゲームの NES ハードウェアの独自の解釈と呼ぶことができるものを書いています。私は FCE を起動し、NES がどのようにグラフィックスを表示しレンダリングするかを観察してきました。

簡単に言えば、NES は 2 つのビットマップに相当するグラフィック情報を保持でき、それぞれのサイズは 128x128 です。これらは PPU テーブルと呼ばれます。1 つは BG タイル用で、もう 1 つはスプライト用です。画面上に描画するには、データがこのメモリに存在する必要がありました。ここで、ゲームがこれら 2 つのバンクよりも多くのグラフィック データを持っている場合、各フレームの最後にこの新しい情報の一部をこれらのバンクに書き込み、そこにあったものを上書きし、次のフレームからそれを使用することができます。

では、古いゲームでは、プログラマーはどのように「バンク スイッチ」を行ったのでしょうか? つまり、レベル デザイン内で、ロードするグラフィック セットをどのように知っていたのでしょうか? 画面がステージのある部分から次の部分にプログラムによってスクロールされると、ロックマン 2 のバンクが切り替わることに気付きました。しかし、どのスプライトを PPU テーブルにコピーし、どこに書き込むかなど、この情報をどのようにレベルに格納したのでしょうか?

もう 1 つの例は、MM2 で一時停止を押すことです。一時停止中に BG タイルが上書きされ、プレーヤーが一時停止を解除すると復元されます。どのタイルを交換したか、どのように元に戻すかをどのように覚えていたのでしょうか?

私が怠け者だったら、巨大な静的ビットマップを 1 つ作成し、その方法で値を取得することができました。しかし、私はこれらの価値を制限して、より本物の体験を作り出すようにしています. MC Kids の作成方法に関するすばらしいガイドを読みました。このゲームのプログラミング方法については最低限のことをしようとしています。これらのプログラマーが持っていたものを使って何を成し遂げたのか、今でも頭がおかしくなります。

編集:私が考えることができる唯一の解決策は、どのタイルがいつPPUにあるべきかを示す個別のテーブルを保持することですが、それはNESが処理できない巨大なメモリリソースになると思います.

4

1 に答える 1

3

wだから、一晩考えて文書を読み直した後、私は完璧な解決策を思いついたと思います。マトリックス!

次のデータが与えられます:

 3, -1, -1, -1, -1
-1,  0,  1,  2, -1
-1, -1, -1,  3, -1
-1, -1,  5,  4, -1
-1, -1, -1, -1, -1

この情報を使用してルックアップテーブル内の情報にアクセスし、必要な情報を判断できます。最初のエントリ(0,0)はマップ全体を定義し、他の値はその特定の画面で必要なものを定義します。

MAP ARRAY    PALETTE   MUSIC   TILESET  STARTINGSCR
   0            0        0        1           4
   1            4        3        2           2
   2                         etc.
   3

したがって、マップをロードするときは、アイテム(0,0)を確認します。XタイルをPPUにロードし、Yカラーパレット、Zタイルセット、およびAミュージックを使用する必要があると表示されます。また、画面0が開始画面であり、レベルがそこから始まることも示されます。それに応じてキャラクターを配置します。

   SCREEN     PALETTE    TILESET   MUSIC   TILEDATA  SCROLLL SCROLLR SCROLLU SCROLLD  
      0           0          1       2         4       true     true    true    true
      1                   etc
      2           2          1       2         3       false   false     false  true

ここで、画面を移行する必要があるとしましょう。現在の画面とターゲット画面を比較できます。新しい画面にPPUにない情報が必要な場合は、その間にデータをロードする遷移を開始できます。その方向にスクロールできるかどうかもわかります。たとえば、ターゲット画面が-1の場合、その方向にスクロールできません。また、フラグをどこかに保存して、その画面にスクロールした場合、後ろにスクロールできないことを確認することもできます。たとえば、画面#2に右に移動することはできますが、画面1に左にスクロールすることはできません。

于 2010-06-13T20:46:10.050 に答える