ファミコンの画面について
目次
スプライト
スプライトも、BG と同じように 8x8 ドットです。色は、BG とは独立した4つのパレットで選びます。
画面上の好きな位置に表示することができ、上下左右に反転が可能です。
画面全体で 64 キャラクターを表示できました。
左向きのマリオを反転すれば右向きになるため、256しかキャラクターがなくても、多彩な表現が可能です。
また、スーパーマリオでは、スターやファイアーフラワーなどが左右対称にデザインされています。
半分は普通の表示で、残りは「反転」して作られているのです。
スプライトは、1枚ごとに BG 画面の「前」か「後ろ」のどちらに置くかを選べました。
ここで、BG 画面にも透明色が設定できる意味が出てきます。
レッキングクルーなどは、壁を挟んで奥と手前で別の世界がある表現がなされていました。
ファミコン版はパズルゲームだけど、業務用は2画面使って、二人で壁を挟んで遊ぶゲームでした。
二人で協力して壁を壊すもよし、相手側に敵を送って邪魔するもよし…
当時の任天堂は、こういう「協力と対戦」の微妙なバランス感覚が上手でしたね。
スプライトは、縦座標、横座標、キャラクタ指定、パレットや反転・BGとの位置関係などの指定の4バイトで1つのデータになります。
これが 64枚分で 256 バイト。BG 画面と同じく、こちらもきりの良い単位に綺麗に収まっています。
ラスタースクロール
基本技術のスプライト表示の方法で説明しましたが、スプライトと走査線は深い関係にあります。
これを使い、ファミコンでは 0番目のスプライトが表示されたことを調べる方法が用意されていました。
0番目が「表示された」瞬間に内部のフラグがセットされ、このフラグは次の走査線の描画が始まるとクリアされました。
これを使うと、任意の走査線が描画されたタイミングを知ることが出来ます。
画面は走査線によって作られていますから、任意の走査線が描画された瞬間に「画面を変更する」と、画面を上下に分割できます。
悪魔城ドラキュラなど、画面の上の方に得点などの表示があり、下の方はスクロール画面、と言う表現はこの方法で作られています。
エキサイトバイクのような、下が固定表示で上がスクロール、と言うものも同様です。
F1 レース、マッハライダーや3Dホットラリーなど、「3Dの視点で道が曲がる」ゲームでは、走査線ごとに横方向にスクロール位置を変えることで表現を行っています。
「ファミコンにはラスター(走査線)スクロール機能があった」とする記述もよく見るのですが、機能としてラスタースクロールが用意されているわけではありません。
非常に短い時間でセットされ、クリアされるフラグを見落とさないようにしながらゲーム全体を制御する、高度なプログラム技術が要求されます。
割り込みがあると、監視を続ける必要がなくなるため、技術がそれほどなくてもラスタースクロールを行いやすくなる。
理論上は、同様の技術を利用して、スプライトの描画を「画面上部」と「画面下部」にわけて行うこともできます。こうすれば、2倍のスプライトが表示できることになります。
ただ、これはあくまでも理論上の話で、市販ゲームで使われた物はないそうです。
MSX2 では市販品で使われた例もあり、ファミコンにもあると聞いたような気がしていたのですが、これは僕の勘違いだったようです。
なお、MSXの画面のページではこの件について触れていません。MSX(TMS9918)では走査線割り込みができず、この手法が使えたのは MSX2以降となるためです。
PPU
単にファミコン風の絵を描きたい、という人には完全な余談になります。
ファミコンの画面表示回路(PPU:Picture Processing Unit)は「綺麗な画面を表示する」ことに特化されていて、画面を表示することに全力を注ぎます。
結果として、CPU から画面を描き変える指令が来ても無視しがちです。
というか、変なタイミングで指令を出すと、画面がおかしくなるのです。
そこで、CPU は PPU のご機嫌をうかがいながら、少しづつ指令を出すことになります。
MSX ではこのようなことはなかったため、画面全部を一気に描き変えることが可能でした。
スクロール機能を持たない MSX で、8dot 単位の動きとはいえスクロールゲームが作れるのは、「画面全部を描き変えて」いるためです。
しかし、ファミコンにはこんな芸当はできません。
画面全部の描き変えが必要な場合は、PPU に画面表示をお休みさせて、描き変えの仕事に専念させます。
ファミコンゲームでシーン変更時に一瞬画面が暗くなるのはこのためです。
ファミコンは、ゲームに関する性能では MSX を上回っていたように思われがちですが、決してそんなことはありません。
特に BG 画面描画の遅さは、ファミコンの泣き所でした。
MSX などでは画面表示回路を VDP(Video Display Processor)と呼んでいたため、表記を取り違えました。
ファミコンでは PPU が正式な呼び方です。指摘してくださった方に感謝いたします。