古いファミコンアプリケーションの「バンク切り替え」スプライト
質問
私は現在、基本的に私が開発していますというゲームを探して、古い学校のNESのハードウェアの私自身の解釈と呼ばれることができるものC#で書いています。私はFCE気合きたし、NESの表示方法を観察し、グラフィックスをレンダリングされています。
一言で言えば、NESは、128×128の寸法のそれぞれを図形情報の2つのビットマップの価値を保持することができました。これらは、PPUテーブルと呼ばれています。一つは、BGタイルのためだったと他のスプライトのためでした。データは、それが画面上に描画するために、このメモリ内にある必要がありました。各フレームの最後で、以降、次のフレームからそれを使用する
だから、古いゲームでどのようにプログラマの銀行のスイッチ」をやりましたか?私は、それらがどのようにロードするグラフィックセットを知っていた、レベルのデザインの中に、意味ですか?私が気づいたことロックマン2 bankswitches画面はプログラム的に、ステージの一部分から次へとスクロールします。しかし、どのように彼らはレベルでこの情報を保存したの? - 何がPPUテーブルに上書きコピーするスプライト、どこでそれらを書くために、
別の例は、MM2で、ポーズを打つことになります。 BGタイルは、一時停止中に上書きされます、そして時にプレイヤーunpausesを復元します。どのように彼らは、彼らが交換されたタイルとそれらを復元する方法を覚えていたのですか?
私は怠け者だった場合は、、私はちょうど方法その1つの巨大な静的ビットマップとちょうどグラブの値を作ることができます。しかし、私はもっと本格的な経験を作成するために、これらの値を制限するために、自分自身を強制しています。私はどのようにM.C.の素晴らしいガイドを読みました子供たちは、作られた、と私はこのゲームをプログラミングする方法についてベアボーンであることをしようとしています。それはまだちょうどこれらのプログラマは、彼らが持っていたもので何をしたかaccomplisehdどのように私の心をbogglesます。
編集:私は考えることができる唯一の解決策はどのようなタイルがどの時点でPPUにあるべき状態という別々のテーブルを保持するだろうが、私はそれはNESができにならないだろうと、巨大なメモリリソースだと思いますハンドルます。
解決
WSO思考と再読み込み文書の夜の後、私は完璧な解決策を考え出したと思います。行列!
次のデータが与えられます:
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
私はどのような情報Iの必要性を判断するために、ルックアップテーブル内のアクセス情報にこの情報を使用することができます。最初のエントリ(0,0)は、他の値は、その特定の画面で必要とされるものを定義するように、全体マップを定義します。
MAP ARRAY PALETTE MUSIC TILESET STARTINGSCR
0 0 0 1 4
1 4 3 2 2
2 etc.
3
マップをロードするときにだから、私は、アイテム(0,0)を見てください。それは、私がPPUに負荷Xタイルに必要と言うYのカラーパレット、Zタイルセット、および音楽を使用します。また、その画面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の中に残っていないことができます。