限界を超えるテクニック(ファミコン編)

おでさん、aka さんと昔懐かしいファミコンソフトの話をしていて、だんだん思い出してきた、古から伝わるコンピュータテクニック。 チープなハードウェアを限界まで叩いて動いていた 8bit 機時代のソフトウェア達。 そんな舞台裏をちょっと紹介してみます。

ファミコン編。

誰でも一回くらいはやったことある、ファミコン。 このハードは設計した人間のおそらく遙かに上に行く使われ方をしたコンピュータの一つでしょう。 ちょっと画面を思い出しつつ読んでください。 🙂

ファミコンの画面は、スプライトと呼ばれる主に自機や敵を動かす画面部品と、BG 面と呼ばれる背景を表示するレイヤーに別れます。 その2つは合成されてテレビに表示されゲームの画面を構成します。 この時期の全てのゲームが小さいキャラ(スプライト)が背景(BG 面)の上をちょこまかしている印象があるは、もともとハードがこのような構成をしているためです。

sp

画面構成要素のひとつ、スプライト。 これはテレビの"垂直同期"に割り込む形で表示するグラフィックの描画の仕方です。

ブラウン管のテレビを写真で撮るとある一定まで描かれて、その下には前のコマが描かれてたりするのを見ることがありますが、これはテレビが上から1ラインずつ描画していくような方式をとっているためです。 写真をとるとその描画の途中がうつるのでこのような現象が発生します。 これが垂直同期で、この1ラインの周期は約 1/30 秒です。

スプライトというのはこの垂直同期がくるタイミングを見計らって、そのラインにキャラクターの画像信号を潜り込ませてで表示させる方式です。 キャラクターが複数あれば、そのぶん何度も割り込ませるわけですが、横にキャラクターが沢山並ぶと 1/30 の時間で信号の割り込みが間に合わなくなり、キャラの一部が消えてしまう現象が発生します。

ファミコンソフトで遊んでいて、キャラが消えたりちらついたりするのを覚えている方もいるとおもいますが、この制約のせいでおきている現象です。 そして、ここに1つのテクニックが隠れています。

実は"ちらつく"という部分。 これはちらついているのではなく、ちらつかせている、というのが正解です。 キャラが全く消えてしまうのは問題があるので、優先順位をくるくるかえて、横に並んだキャラをだしたりださなかったりをソフトウェア的に制御して、ちらつかせてでも、なんとか表示させるようにわざとプログラムされています。

このテクニックを最初に使ったゲームはちょっと覚えていませんが、ハドソンのへクター87は、一部ボス面でこのテクニックをつかっていなくて、いきなり見えない玉にあたって砕ける部分があったのは鮮明に覚えています。。

次。 画面構成要素のもう一つ BG 面。

主に背景を担当するこの面は、PCG とよばれるところに格納された、扱える数に制限のある、小さな画像ブロックを敷き詰めて表示されています。 ドラクエとかでいえば、森の"木" とか、"平地" とかああいったブロック要素をならべて構成されています。 (なのでリアルタイムに任意の線を描くとか、大きな1枚絵を表示するのが非常に難しい)

dq

BG 面はテレビ画面よりも大きくとられており、そのある一定場所を表示することによりいわゆるスクロールを実装しています。

ファミコンのスクロールにはいくつか制限がありますが、特に画面の一部をのこして別の部分をスクロールする分割スクロールが、縦スクロールについてできません。

たとえば、グラディウスではパワーアップゲージが下に配置され、上のゲーム画面は横にスクロールします。 アーケード版の初代グラディウスはゲーム画面が横スクロールしながら、自機の動きによって縦スクロールにもするのですが、ファミコンの分割縦スクロール制約のせいで、ファミコン版ではこの仕様がオミットされています。 縦にスクロールしようとするとパワーアップゲージまで上下しちゃうのです。 🙂

gra

で、できないと思われていた分割立てスクロールですが、ファミコン中期、後期になるとこれができるようになってきます。 ぼくが最初に見たのは、バンダイのドラゴンボール。 マリオ3とかグラディウス2とかもできています。

グラ2はなっている覚えがないのですが、大抵の縦分割スクロールを実装しているゲームで、分割の境目がちらつくような現象が見られます。 ぼくはこの実装をどうやっているのか分からないのですが、なにか涙ぐましいすごいテクニックが潜んでいるに違いありません。。

ああ、長くなってしまった。。 この引き出しをあけてしまうと永遠に続きそうです。。(笑

いまじゃ当然のことも、ほんの 20年前はえらい大変だったんですよ、、、とおじさんは語るのでありました。

続く。

このエントリーをはてなブックマークに追加
  • sprite02.png
    Java + LWJGL + OpenGL で 2D ゲーム
    OpenGL, Java, LWJGL, ゲーム, bit, 動作, 実装, Library, Windows, テクスチャ, プログラム, 方, 時代, 環境, 32, 64, BG, Linux, MHz, Mac
  • iconia-00.png
    Android タブレット ICONIA A700 購入
    タブレット, キーボード, Android, PC, 入力, 日本語, Tegra, USB, 便利, 10, 700, HiDPI, ICONIA, NVIDIA, UNIX, エディタ, コントローラ, ソニック, 場合, 次
  • xbox01.png
    XBOX に XBMC 8.10 ‘Atlantis’ をいれてみた
    XBOX, XBMC, 8.10, テレビ, 動作, こっち, ネットワーク, 対応, 1.0, AppleTV, CentOS, DVD, Python, Ubuntu, いろいろ, アプリ, オーディオ, ブート, メディア, 上
  • wpid-wp-1366332913417.jpg
    WordPress for Android 更新
    画像, WordPress, 投稿, 下書き, 操作, 画面, Android, for, サイト, サーバ, スマートフォン, ローカル, 保存, 編集, 写真, 更新, 状態, 設定, 2.3, HTML
  • screenshot-xbmc-5.png
    XBMC for Linux 日本語化
    XBMC, root, フォント, Linux, XBOX, ttf, 版, 2008, Windows, 日本語, 日本語化, Arial, Mac, ファイル, メディア, 再生, 方法, 画面, 設定, -rw-r--r--

限界を超えるテクニック(ファミコン編)” への2件のコメント

  1. グラIIやスーマリ3などは、確かある走査線から画面モードを変えていたはず。
    だから、縦スクロールのSHTでも、画面横が固定されるっていう構成はできなかったので、縦に画面が狭くなってちょっとやりにくかったですね(^^;

    後は、ROMのバンクを切り替えることで、キャラクタパターンをごっそり入れ替えてデカキャラ(この表現も懐かしい)や背景をアニメーションさせてたりしてましたね。

    それにしても、当時のROMって、1Mとか言ってもビットでしたよね。
    キロバイトにすると、たった4K・・・
    今のプログラマの人に、それだけの容量でゲームを作れる人はいるんだろうか?って思います(汗

  2. おぉぉ、あれ画面モード途中切り替えでやってるんすか! なんてことを(笑)

    ありましたね~、PCG 入れ替えアニメーション。 マリオ3あたりから、やたら背景がぴょこぴょこ動くようになった記憶が… あと、ファイナルファンタジーの飛空艇からかな、、超高速スクロールとか。。

    当時は、なにか限界を超えようとするハングリー精神がありましたよね!

    #そか、グラ2じゃなくてグラIIですね。 2 は MSX でした 🙂

コメントを残す

メールアドレスが公開されることはありません。