VOL.22 — V9968 SPRITE & WEBGL

夢のVDPの奥へ、世界のブラウザへ。
——V9968のスプライトで立ち絵を組み、VN StudioをWebGLでブラウザへ

はじめに

Vol.19で、ひとつの物語を、Windows・XZ80・PSP・X68000・MSXという違う機械で、その機械らしく動かす話を書いた。今回は、その「届ける」を、ベクトルの異なる二つの方向へすすめたい。

ひとつは、より深い場所へ。今から40年前に販売されていたMSX向けに、「いま」新規開発を進められている新型VDP「V9968」で、立ち絵をスプライトで組み上げる技の話をしたい。

もうひとつは、より広い場所へ。ゲームエンジン「VN Studio」をWebGLに対応させたことで、制作した作品を普通のブラウザのみで——パソコンでもスマートフォンでも、インストールなしで——すぐ遊べるようになった。

より深く潜ることと、より広く開くこと。今回は、その両方の報告である。

第1章:なぜ、立ち絵を「スプライト」で組むのか

Vol.19で紹介したV9968は、既存の製品ではなく、レトロPCであるMSX向けに、いま現在開発が進められている「新型のVDP」——画面の表示を担うモジュールだ。当時我々が渇望したMSXを今実現するプロジェクトである。あれから、本工房ではその版のVNStudioの開発を少しずつ進めてきた。今回はその経過報告になる。

本題の前に、「スプライト」について少し説明したい。

8bitパソコンの時代、画面に絵を描く処理はとても遅かった。背景を一枚書き換えるだけでも数秒かかることもある。だから、キャラクターがすばやく動くアクション性の高いゲームを、絵をそのつど描き直すやり方だけで作るのは難しかった。

そこで使われたのが、スプライトという専用のハードウェアだ。あらかじめ用意した小さな絵を、背景とは別に、好きな位置へ瞬時に表示できる。背景を描き直さなくても、その小さな絵——スプライト——だけを動かせば、キャラクターがなめらかに動く。当時のアクションゲームの多くは、この仕組みに支えられていた。

ただし、スプライトには大きな制約があった。構造上ひとつのスプライトで同時に使える色数は少なく、画面に同時に出せる枚数にも限りがある。小さなキャラクターを軽やかに動かすためのものだから、大きくて色数の多い絵を映すことは、もともと想定されておらず困難なのだ。

その、本来は小さなキャラクター用のスプライトを、私は立ち絵という大きな一枚絵の表示に使うことにした。少し変わった使い方だ。なぜ、わざわざそうしたのか。

理由は、描画をどうにか改善して、物語への没入感を大切にしたかったからだ。

立ち絵を画面に直接描いていくと、描いている途中の様子が、そのまま画面に見えてしまう。現在のモダンなPCやスマホでは一瞬で終わる処理なので全く問題にならないが、MSXなどのレトロPCでは、上から順にじわじわと絵が現れ、描き終わるまでに秒単位で時間がかかる。ゲームエンジンにおいて、これらの描画のしくみは、プレイヤーがゲームの「物語」を体験する質に直接影響するものであるため、私はどうしてもそれが気になった。

幸いなことに、V9968ではスプライト機能が大きく拡張されており、先に述べた弱点が大きく緩和されている。そこでV9968版では、立ち絵をあらかじめ画面の外側(VRAM)で組み立てておき、必要な時に組み上がったものを表示する「VRAMキャッシュ」方式にした。画面に映らない作業領域で絵(スプライト)を用意し、完成した瞬間にVDPコマンドでスプライトを表示するのだ。描いている最中は原理上見えないため、ちらつきは一切出ない。

MSX turboR+V9968(SCREEN 8)で、立ち絵をスプライトとして組み、VRAMキャッシュから一度に表示している様子。描画途中のちらつきなく立ち絵が現れ、フェードインもかかる。開発中のV9968に対応したopenMSX上の画面。音が出ます。

この効果が非常に高かったので、先に公開しているV9990版の立ち絵も、色数制約などからスプライトの実装は断念したものの、同様のVRAMキャッシュで画像を表示させるようにした。

第2章:限られた色を、絞り出す

スプライトで立ち絵を組むと決めたとき、正面から向き合うことになったのが、色数の制約だった。

V9968のスプライトは、使える色をいくつかの「組」に分けて持っている。ひとつの組で同時に出せる色数は16色に限られていて、立ち絵全体をひとつの組だけでまかなうことはできない。そこで、こういうやり方をとった。

立ち絵を縦の細い短冊に切り分け、短冊ごとに、いちばん色の合う組を選ぶ。髪のあたりはこの組、肌のあたりはあの組、というように、場所ごとに最適な色の組を割り当てる。それでも色が足りない、特に厳しい短冊だけは、二枚を重ねてさらに色を足す。こうして、乏しいパレットの中に、一枚の立ち絵ぶんの色を、場所ごとにやりくりして収めていく。

小さなキャラクターを動かすためのスプライトを、大きな一枚絵の表現へと転用し、その限られた色数を、短冊単位の工夫で使い切る。性能が足りないから諦めるのではなく、足りない器を、どう使い切るか。そこに、この時代の機械を触る面白さがある。

第3章:V9968のスプライトだからできたこと

V9968には、スプライトの表示の透明度を個別に4段階に設定する機能がある。このおかげで、立ち絵をフェードインでゆっくり浮かび上がるように表示させることが可能だ。じつは、立ち絵をスプライトとして組めば、この透明度の機能でフェードインまでかけられる——その発想は、私ひとりで思いついたものではない。開発中のV9968について、開発者の方から直接アドバイスをいただいて、はじめて気づけたことだった。これは現在のビジュアルノベルなどでよく使われる表現だが、MSXでもV9968という新VDPのスプライト機能を活用すれば、不可能ではなく実現できる。いただいた助言のおかげで、それを確かめることができた。

なお、これは開発中のV9968に対応したエミュレータ(openMSX)の上で行っている。以前にXZ80という私のオリジナルマシンの夢Vol.7で夢のマシンを語ったとき、その先にFPGAによる実機化という未来を置いた。今回のMSX+V9968というモデルは私のそのビジョンにとても近い。今後もV9968の開発を見守りながら、私もXZ80という夢のマシンを形にする道を、一歩一歩歩み続けていきたいと考えている。

第4章:そして、いちばん広い場所——ブラウザへ

ここからは、いちばん広い場所の話に移りたい。

VN Studioが、WebGLに対応した。作品を、ブラウザで遊べる形に書き出せるようになった(公開版 0.93.1-beta)。プレイヤーは、Unityのような特別なソフトを入れる必要はない。もはやWindowsもインストールも不要だ。手持ちのスマホやタブレットで、ブラウザでそのページを開けば、すぐに物語が始まる。

また、スマホ・タブレット用に、タッチ操作への対応もした。画面をタップすれば会話が進み、少し長押しすればメニューが開く。指先だけで物語を読み進められるようになった。

さらに、GitHub Pagesへのワンクリック公開を追加した。制作者は、作品を公開したい場所のアドレスを入れてボタンを押すだけで、自分のページに作品が上がる。これまで、ブラウザ版を世に出すには、ファイルを書き出し、指定される場所に書式を合わせて、いずれかにアップロードする、という手間がいくつもあった。その段取りを、ボタンひとつにまとめることができた。作る人が、機械の都合に振り回されない——公開の手続きで立ち止まらずに済むように——という、VNStudioがずっとこだわってきた考え方を、ここでも広げたつもりだ。

VN StudioエディタのWebGL公開パネル。公開先をGitHub Pages/itch.io/unityroomから1つ選び、GitHubへの自動公開(git不要・1クリック)では公開先リポジトリのURLを入れて「GitHubに自動公開」ボタンを押す。下部に「WebGL公開物フォルダを開く」ボタンがある。
VN StudioのWebGL公開パネル。公開先を選び、リポジトリのURLを入れて「GitHubに自動公開」を押すだけで、作品がGitHub Pagesに上がる。

なお、この新機能を使って、工房の「キョウカちゃんの新婚さんいらっしゃい!」の体験版を、このブラウザ版として公開してみた。これからはパソコンだけでなく、iPhoneやiPadのブラウザでも、インストールなしでそのまま遊べる。

まだ現在はできないこともある。ブラウザ上でのセーブ・ロードや、動画(webm)を使った背景は表示されない。そういった課題もあることはお伝えしておきたい。

おわりに:奥へも、広くへも

同じひとつの作品を、開発中の夢のVDPというより奥の機械にも届けたい、スマホやタブレットでも開けるというより広い場所にも届けたい。深く潜ることと、広く開くこと。そのどちらも、Vol.19で書いた「共通の魂と、固有のボディ」——物語を変えずに、その場所らしい姿で立ち上げる——は一貫している。

機械の都合でもなく、技術の新しさを誇るためでもなく、まず届けたい体験があって、仕組みはそのあとにある。スプライトで立ち絵を組むのも、ブラウザで遊べるようにするのも、「あなたの物語」を、できるだけ多くの場所で、できるだけその場所らしく立ち上げるための、手段のひとつだ。

なお、開発中のV9968について貴重な助言をくださった開発者の方に、あらためて感謝したい。

奥へも、広くへも。その両方を、これからも少しずつ進めていきたい。