12

NESがどのようにそのグラフィカルな筋肉を表示するのか疑問に思っています。私はオンラインで物事を調べてそれを読み通しましたが、最後にもう1つ疑問に思っています。それはNametablesです。

基本的に、私が読んだことから、NESネームテーブルの各8x8ブロックは、グラフィックメモリを保持するパターンテーブル内の場所を指しています。さらに、ネームテーブルには、16x16ブロックごとに特定のカラーパレットを設定する属性テーブルもあります。それらは次のようにリンクされています。

(16個の8x8ブロックを想定)名前付きテーブル、ABCD =スプライトデータへのポインター:

ABBB
CDCC
DDDD
DDDD

属性テーブル、1 2 3 =カラーパレットデータへのポインタ、<は左に値を参照、^は上、'は左と上に:

1<2<
^'^'
3<3<
^'^'

したがって、上記の例では、ブロックは次のように色付けされます

1A 1B 2B 2B

1C 1D 2C 2C

3D 3D 3D 3D

3D 3D 3D 3D

さて、これを固定画面に表示すると、うまく機能します。NESの解像度は256x240ピクセルだからです。では、これらのテーブルはどのようにスクロール用に調整されますか?

Nametable0はNametable1にスクロールできるため、スクロールを続けるとNametable0は再び折り返されます。私が得ること。しかし、私が得られないのは、属性テーブルのラップアラウンドもスクロールする方法です。私がオンラインで読んだものから、属性を割り当てる16x16ブロックは、画面のエッジタイルに色の歪みを引き起こします(SMB3で左から右にスクロールした場合、またはその逆の場合に見られます)。

私が懸念しているのは、名前テーブルをスクロールする方法を理解していることですが、属性テーブルをどのようにスクロールしますか?たとえば、画面の左側に緑色のブロックがある場合、画面を右に移動すると、理論的には、フレーム内に移動するまで右側のタイルも緑色になり、元に戻ります。彼らの通常の色。

~~~~編集:私はスキャンライン、XとYについて知っていることを指摘したいと思います。この考えはちょうど私の心を駆け巡りました。

スキャンラインYが10になっているとしましょう。つまり、名前テーブルに水平方向に10個の値を読み込んでいます。これは、ピクセル幅が8しかないため、最初の列が画面から外れていることを意味します。ただし、幅が16であるため、color属性はそのままです。

列全体の色属性が緑色であると仮定すると、ユーザーにとって、画面の左側の最初の6ピクセルは緑色になり、画面の右端の10ピクセルも緑色になると仮定するのは正しいでしょうか。それで、画面によると、左という私の仮定は正しいでしょうか?

4

5 に答える 5

2

このサイトは、あなたがすでに非常によく知っていると確信しています。はじめに、私は NES 用にプログラムを作成したことはありませんが、これまでにリリースされたすべてのゲームボーイ ハードウェアの経験があり、NES は GB/DMG と多くの癖を共有しています。いくつかのことのいずれかを行う必要があるに違いありません。

  1. 属性テーブルをスクロールしないでください。移動している方向に沿って、すべてのレベルに同じような色のブロックがあることを確認してください。多くの第一世代のゲームがこれを行ったと思います。

  2. 先に進んで、制限付きの属性スクロールを許可します。変更が発生している領域が部分的に色を共有しているか、変更が目立たないように十分にまばらであることを確認してください.

  3. 古い skool atari 2600 タイマーを取り出し、HBlank 更新の最後に $2006 を記録するように書き込みの時間を計って、必要なカラー スワップを取得します。数ティック待ってから、HBlank リターン期間中に元に戻して、次の行は影響を受けません。これが最も頻繁に使用されるソリューションだと感じていますが、本当に優れたエミュレーターと忍耐力がなければ、お尻の痛みになります. また、エフェクトを完了するために複数のスキャン ラインで割り込みを待機する必要があるため、全体的な CPU 使用率が少し低下します。

もう少し具体的な回答をお願いしたいのですが、少しでもお役に立てれば幸いです。ありがたいことに、GB/DMG にはもう少し高度なスクロール システムがありました。:)

于 2010-06-11T14:46:16.807 に答える
1

スーパーマリオブラザーズ3と星のカービィアドベンチャーはどちらも、スクロールすると画面の端に色のアーティファクトが表示されます。どちらのゲームも、画面の左8ピクセルを空白にするビットを設定しているため、1つのフレームで0〜8ピクセルが影響を受けると思います。

私の記憶が正しければ、カービィの冒険は常に画面の目立たないようにスクロールオフしている画面の側面に色のグリッチのある列を配置しようとします。これらのアーティファクトは、それ自体の問題を引き起こす垂直ミラーリングに切り替えずに防ぐことはできないと思います。

免責事項:私がNESコードを書いてから5年が経ちました。

于 2010-06-11T21:22:38.233 に答える
1

各ネームテーブルには独自の属性テーブルがあるため、あるネームテーブルから別のネームテーブルにスクロールするときにグラフィカルなアーティファクトが発生することはありません。あなたが言及している色のグリッチのタイプは、ゲームが垂直方向と水平方向の両方にスクロールする場合にのみ問題になります。ネームテーブルは 2 つしかないため、両方向にスクロールするには、表示されている画面を共食いする必要があります。この問題にはさまざまな解決策があります。その概要は、次の nesdev 投稿に記載されています。

http://nesdev.parodius.com/bbs/viewtopic.php?p=58509#58509

于 2010-12-30T17:37:55.067 に答える
0

各ネームテーブルには、独自の属性テーブルがあります。ゲーム ワールドを 2 つの画面だけに制限する場合は、名前テーブルと属性テーブルを 1 回記述するだけで済みます。難しいのは、ワールドを 2 画面よりも大きくしようとするときです。スーパー マリオ ブラザーズ 1 は、右にスクロールし、必要に応じてラップアラウンドし、その列が表示される直前に、一度に 1 列のブロック (16 ピクセル) ずつレベルをレンダリングすることでこれを行いました。これを効率的にコーディングする方法がわかりません (vblank 時間はミリ秒しかないことに注意してください)。

于 2012-07-30T03:27:09.910 に答える
0

このサイトが何かの参考になるかもしれません。 http://www.games4nintendo.com/nes/faq.php#4

(「$2005/2006 はどうなっていますか?」を検索して、その辺りを読み始めてください。)

基本的に、ピクセルを完璧にすることは不可能のように見えますが、それらはおそらく調べる必要があるビットになるでしょう.

もっとお役に立てれば幸いです。

于 2010-06-11T07:31:14.747 に答える