雑記

【自由研究】SFC版「龍虎の拳」の拡大縮小機能

個人的にずっと疑問だった、スーパーファミコン版「龍虎の拳」のズームイン・ズームアウト機能について調べてみました。

ハードウェア制約上できないはずのことを、いったいどうやって実現しているのか?

はじめに

1990年に発売されたスーパーファミコン。拡大縮小、半透明といった高度な映像表現がウリでした。

しかし、これらの演出効果はBGにしか適用できず、スプライトには使用できません
専門知識がないので漠然とした説明になりますが、「BG」は背景画像、「スプライト」はその上に乗っかって動くキャラクターです。


マリオカートを例にすると、カートや土管が「スプライト」で、グネグネと動くコースが「BG」です。
このスプライトは、拡大縮小といった機能を使うことができません。

それっぽいことをしているとしたら、一時的にスプライトと同じ絵をBGに配置して、それを拡大したりしています(たぶん)。

しかし、1993年に発売された「龍虎の拳」では、なんとキャラクターの拡大縮小を実現しています。

縮小(ズームアウト)時

拡大(ズームイン)時

キャラクターの距離に応じて、画面がズームイン、ズームアウトされます。
ネオジオ版と比べると変化がマイルドなので、ちょっとわかりづらいですかね?

GIF画像にしてみます。

飛燕疾風脚を放つロバートさん。

迎える藤堂さん。

ね、同じポーズなのに、大きさが変わっていますね。

背景は「BG」ですので、拡大縮小ができるのは不思議ではありません。

しかし、キャラクターたちは「スプライト」。不可能なはずです。
一体どうやっているんでしょうか。

調べてみました!(量産型サイト風に)

いざ検証!

検証用に、レトロフリークと、GV-HDRECを用意。
60フレームでゲーム動画を撮影し、チェックすることにしました。
動画の再生はAviUtlを使用しました。

まずは、ネットの説を検証

匿名掲示板だったか、SNSのコミュニティだったか忘れましたが、
当該技術について「SFC版の龍虎の拳は、拡大時と縮小時のキャラクターグラフィックをそれぞれ用意しており、それを切り替えている」と解説されていました。

なるほど…つまり、スムーズに拡大縮小しているのは背景のみで、キャラクターのグラフィックは「小」か「大」の2種類しかないということ。

であれば、どこかでキャラクターが背景とマッチしない「浮いた」瞬間があるはずだ!と思い検証してみました。

録画した動画をコマ送りにしてチェック。


いちばん左が縮小時。いちばん右が拡大時。
その中間は・・・アレ?

縮小と拡大の間にも、中間サイズのグラフィックが存在します。

これはいったいどういうことでしょうか。

「大小2パターン」というのは間違いで、4枚分のグラフィックを用意しているのでしょうか?
でも、龍虎の拳は格闘ゲーム。ただでさえ膨大なモーションパターンを4倍にするなんて、当時のゲームの容量からして厳しいはず。たしか龍虎はスト2と同じ16メガでした。

ここで改めて、拡大時のグラフィックと、その直前のグラフィックを交互に表示してみます。

リョウサカザキの顔と右手にご注目ください。変化がありません。
この部分を中心に、まわりのパーツがウネウネ動いている感じです。
そして、左手の拳を見る限り、各パーツもどうやら同じグラフィックで、外側にスライドしているだけのようです。

拡大時、縮小時も、スプライトのパーツは同じ?

仮説ですがこう思いました。

拡大時と縮小時のスプライトは別の絵ではなく、
各パーツの位置をドット単位でずらすことで表現しているのではなかろうか?と。

これであれば、スプライトを別々に用意する必要はなく、ずらす部分を調整することで「中間」の状態を表現することができます。

リョウとロバートの立ち絵(拡大時)を格子状に刻んで組みなおしてみたところ、立ち絵(縮小時)とイコールになりました。

見る限り、信憑性は高そうです。

私的な結論

スーパーファミコン版の龍虎の拳は、
キャラクターのスプライトの分割して、
配置をコントロールすることで

全体像を大きく見せたり小さく見せたりしている。

さいごに

いかがでしたでしょうか。って書くといかがわしいですが、

いかがでしたでしょうか。

素人目での判断なので、多分に間違っている部分があるかもしれません。
そもそもスプライトって重なった部分はどちらを表示にするとか制御できるんでしょうか?
デザエモンしかやったことのない自分にはわかりません。
もしお詳しいかたがいらっしゃいましたら、ご指摘いただけると幸いです。

最後まで読んでいただきありがとうございました。

COMMENT

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください