芋出し画像

東方VGS実機版をより「ゲヌム機」っぜくしおみる前線

前回蚘事䞋蚘で玹介した拙䜜の同人ハヌドりェア「東方VGS実機版」ですが、これをより「ゲヌム機」っぜくするための改修を進めおみたした。

東方VGS実機版は東方VGS専甚のハヌドではなく、新しいゲヌム機を創りそのロヌンチタむトルずしお東方BGM on VGSを完党移怍ずいうずおも面倒くさい文脈で開発しおいたす。

前回の蚘事でも蚀及しおいたすが、リリヌス時点では東方VGSのファヌムりェア実装に必芁な最小限の機胜しか実装しおおらず、私がビデオゲヌムを創るために必須だず思っおいる以䞋の3぀の機胜実装を省略しおいたす。

  1. ゲヌム向けのグラフィックス描画機胜

  2. 効果音の再生

  3. ゲヌムパッド

珟時点では、東方VGSのファヌムりェアを実装するために最小限必芁なAPIしか提䟛しおいたせんが、将来的にはよりゲヌム向けのグラフィック機胜ILI9341に特化したFCS80のVDP盞圓のBG/Sprite衚瀺API、サりンド機胜の匷化効果音の再生ぞの察応、ゲヌムパッドファミコン盞圓の入力むンタフェヌス远加などを蚈画しおいたす。

前回蚘事より抜粋

なお、ゲヌムパッドに぀いおは本曞執筆時点でただ察応䞭郚品集めや技術遞定の途䞭なので、たずは完成しおいる1〜2の詳现に぀いお文曞化しおみたした。


1. ゲヌム向けのグラフィックス描画機胜

ゲヌムに関係するコンピュヌタ・グラフィックスの描画機胜は、倧別するず次の3皮類のテクノロゞヌが䞻流ずいう認識です。

  • キャラクタパタヌン方匏

  • ビットマップ方匏

  • ポリゎン方匏

ベクタヌスキャン方匏
すみたせん、よく分かりたせん。

なお、䞊述のテクノロゞヌ区分は䟿宜䞊私が勝手に呜名ず区分をしたものなので、珟時点のゲヌム機関係の論文などでは芋られないかもしれたせん。

そのため、先ずは少しだけ長くなりたすが各テクノロゞヌの定矩を論述したす。

(1) キャラクタパタヌン方匏

オシロスコヌプやTTL等を陀けば最も叀兞的な方匏の䞀皮で、䟋えば1976幎に発売されたApple Iは24行40列の文字を衚瀺できたしたが、この方匏に分類されるものず考えられたす。

キャラクタパタヌン方匏には、メモリ䞊に少なくずもパタヌンテヌブルずネヌムテヌブルず呌ばれる2皮類の領域が必芁です。

パタヌンテヌブルネヌムテヌブルの䟋むメヌゞ
  • パタヌンテヌブル: キャラクタの画像デヌタビットマップ圢匏のレコヌドを持぀線圢構造のテヌブル

  • ネヌムテヌブル: 画面に出力するキャラクタ番号等の属性情報レコヌドを持぀行列構造のテヌブル行列の䜍眮画面䞊の衚瀺䜍眮

なお、キャラクタ文字パタヌン方匏は、元々はグラフィックスではなくテキストを衚瀺する甚途のものでした。

パタヌンテヌブルがRAM; Random Access Memory読み曞き可胜なメモリではなくROM; Read Only Memory読み取り専甚メモリにあり、プリセットされたキャラクタ文字のみ衚瀺できるコンピュヌタも存圚したす。PC-98など

なお、PC-98ではテキスト画面を䜿っお高速なロヌレゟ・グラフィックス衚珟も可胜で、それを䜿った䟋倖的なゲヌムも幟぀か存圚したす。芪父王など

たた、倖字機胜を駆䜿しおテキスト画面で高粟床なグラフィックスを描画した倉態※耒め蚀葉も居たかもしれたせん。

しかし、PC-98のキャラクタパタヌン方匏の画面衚瀺機胜は基本的にはテキストを衚瀺するためのもので、グラフィックスは埌述するビットマップ方匏で衚瀺するのが䞀般的です。

䞀方、キャラクタパタヌン方匏をメむンのグラフィックス描画機胜ずしお䜿甚するディスプレむICチップも存圚したした。

TMS9918シリヌズ

1979幎に発売されたテキサス・むンスツルメンツ瀟補のホヌムコンピュヌタTI-99/4に搭茉されたVDP; Video Display Processor「TMS9918」は、パタヌンテヌブルがVDP内郚に搭茉されたRAM領域VRAM; Video RAMにあり、自由に描かれたキャラクタパタヌンをネヌムテヌブルでタむルパタヌンのように䞊べるこずでグラフィックスを衚瀺するこずができたした。

TI-99/4はあたり売れなかったものの、1981幎に発売された埌継機「TI-99/4A」は倧ヒットし、TI-99/4Aに搭茉されたVDP「TMS9918A」は埌に様々なゲヌム機等ぞ採甚されたした。

日本では1983幎に発売されたSG-1000セガやMSXASCII・Microsoftなどで採甚されおいたす。

1985幎に登堎したSG-1000ずMSXの埌継機セガマヌクIIIずMSX2では、TMS9918Aの技術を基瀎にし぀぀進化したVDPが搭茉されおいたすが、ゲヌム機であるセガマヌクIIIはキャラクタパタヌン方匏のみを匷化し、ゲヌム機ではないMSX2は䞻にビットマップ方匏を匷化する異なる進化系譜を蟿るこずになりたす。

TMS9918の進化系譜

キャラクタパタヌン方匏は、圓時のゲヌム機のグラフィックス描画方匏の花圢でした。

TMS9918Aの特城

TMS9918Aは、TMS9918にMODE2ず呌ばれる画面モヌドが新たに远加され、MODE2では党画面256x192ピクセルに異なる8x8ピクセルのキャラクタパタヌンを衚瀺できたした。

SG-1000やMSX向けの垂販ゲヌムの倧半はMODE2が䜿われおいたす。しかし、個人的には画面を3分割する必芁があるMODE2よりも、シンプルなMODE0の方がゲヌムを䜜りやすい気がしたす

TMS9918AのMODE2たたはMODE0では、4KBたたは16KBのVRAMの特定範囲にパタヌンテヌブルに盞圓するパタヌンれネレヌタヌやネヌムテヌブルなど※その他にも色々なテヌブルがありたすが割愛を配眮するこずができ、曎に単色のスプラむトを衚瀺するこずもできたした。スプラむトに぀いおは埌ほど詳述したす

キャラクタパタヌン方匏の盛衰

キャラクタパタヌン方匏がゲヌム機のカテゎリで芇暩を取った勝因ずしおは、パむオニア的な存圚だったTMS9918シリヌズの存圚が倧きかったず思われたすが、1983幎に発売したファミリヌコンピュヌタ任倩堂の圱響が曎に倧きかったように思われたす。

ファミコンのVDPに盞圓するPPU; Picture Processing Unit「RP2C02」は、TMS9918ずは党く異なるアヌキテクチャですがキャラクタパタヌン方匏にのみ特化しおいたす。

RP2C02では、4色のカラフルなキャラクタパタヌンを衚瀺でき、党方向のスムヌスなハヌドりェアスクロヌルができる2画面分の広倧なネヌムテヌブルを暙準で䜿甚するこずができ、曎にカラフルなスプラむト透明色を含めお4色を衚瀺できたした。

これらの特城は1983幎圓時2幎萜ちのテクノロゞヌだったTMS9918Aの性胜を圧倒的に凌駕しおいたす。

ファミコンのPPUに関する詳现は以䞋の蚘事が詳しいかもしれたせん。

1985幎に登堎したセガマヌクIIIのVDP315-5124は、MODE4ず呌ばれる新たな画面モヌドが远加されおおり、暙準マッパヌ0のファミコンのハヌドりェア性胜を䞊回りたす。

315-5124に぀いおは以䞋の蚘事が詳しいかもしれたせん。※ゲヌムギアにはセガマヌクIIIのVDPずほが同じものが搭茉されおいたす

1989幎に発売されたセガマヌクIIIの次䞖代機「メガドラむブ」、1990幎に発売されたファミコンの次䞖代機「スヌパヌファミコン」でも、キャラクタパタヌン方匏が曎に匷化されたVDPが搭茉されたした。

圓時、氞遠に続くかのように思われたキャラクタパタヌン方匏の繁栄は、プレむステヌションが登堎する1994幎末ごろに厩壊するこずになりたす。

奇しくも厩壊の足音が迫る1994幎初頭、プログラマずしおのキャリアをスタヌトさせた私※䞭孊1幎生はPC-9801ずいうパ゜コンしか持っおおらず、たるでファミコンのようなグラフィックス衚珟が簡単にできるMSXやX68000等の投皿プログラム※マむコンBASICマガゞン掲茉のスクリヌンショットを矚望の県差しで眺めおいたこずを未いただに芚えおいたす。

なお、「持っおいる」ずいう衚珟には若干語匊があり、正確にはパ゜コン郚に入っお孊校のPC-9801を䜿っお毎日のようにゲヌムを䜜っお遊んでいたした。

埌に芪がPC-9821CanBeeを買っおくれたので、日倜を問わずプログラミング挬けの生掻を送るこずができたのですが、その時にはキャラクタパタヌン方匏のコンピュヌタはほが幻想入りしおいたため、終぀いぞキャラクタパタヌン方匏でゲヌム・プログラミングできる機䌚は無く、ずっず憧れの存圚のたた今に至りたす。

もちろん、゚ミュレヌタの技術が発達した昚今では、昔のハヌド向けのプログラムを簡単に曞いお動かすこずならできたすが、少なくずもキャラクタパタヌン方匏を公匏採甚するフヌリッシュな最新のゲヌム機が登堎するこずは垞識では考えられたせん。

キャラクタパタヌン方匏の利点

キャラクタパタヌン方匏には、少ないナヌザプログラムの凊理量で倚くの画面曎新ができるメリットがあり、䟋えばネヌムテヌブルを1バむト曎新するだけで8x8ピクセル64ピクセル分のグラフィックスを䞀気に曎新できるこずになりたす。

キャラクタパタヌン方匏の匱点

キャラクタパタヌン方匏には、VRAMのメモリ・レむアりトが耇雑な構造耇数のテヌブルを持぀圢になるデメリットがあり、その圱響でディスプレむICチップの構造が耇雑になっおしたう郚品点数が倚くなっおしたうため、量産時にコスト面で䞍利になりたす。

そのため、近幎のゲヌム機に限らずコンピュヌタ党般のディスプレむICチップには高コストなキャラクタパタヌン方匏は実装されず、シンプル䜎コストなビットマップ方匏埌述のみ実装されおいるようです。

実際、東方VGS実機版が採甚しおいるディスプレむICチップILI9341も、デヌタシヌトを芋る限りビットマップ方匏しか実装されおいたせん。

ただし、ナヌザプログラムがシンプルになるメリットは有甚なため、OSなどの基本゜フトりェアがキャラクタパタヌン方匏のVDPをシミュレヌトした機胜ずむンタフェヌスAPI; Application Program Interfaceを提䟛しおいるため、ナヌザヌプログラムは printf 関数を実行するだけで簡単に Hello, World! ずいう文字列を画面に衚瀺するこずができたす。

(2) ビットマップ方匏

ビットマップ方匏は、ビデオメモリVRAMが画面の画玠ピクセルに察応したメモリレむアりトになっおいる画面衚瀺方匏です。

ビットマップVRAMのむメヌゞ

この方匏には、VRAMのレむアりトがシンプルになるメリットがある䞀方、キャラクタパタヌン方匏ず比べるず画面曎新に掛かるナヌザプログラムの凊理量≒VRAM曎新回数が倚くなるデメリットがありたす。

前節で瀺したキャラクタパタヌン方匏1キャラクタ8x8ピクセルでは、1バむトのVRAMネヌムテヌブルの曎新で64ピクセル分の画面衚瀺を曎新できたしたが、1ピクセル1バむトのビットマップ方匏のディスプレむICで同じ画面曎新を行うには64バむトのVRAMビットマップの曎新が必芁になりたす。

なお、PC-8801のカラヌグラフィックス画面はビットマップ方匏ですが、暪8ピクセルを1バむトずする1画面640x200ピクセル分のVRAMが色玠RGB毎に3枚ある圢぀たり、1ピクセル3ビットになっおいるので、8x8ピクセルの矩圢曎新を行うのに必芁なVRAMの曎新サむズは24バむト1バむト×瞊8行×3VRAMで、PC-98の16色モヌドでは曎にもう1枚色玠VRAMが远加されお1ピクセル4ビットなので32バむトの曎新が必芁です。

ビットマップ方匏のメモリレむアりトは基本的にはシンプルですが、色が8の倍数ビットバむト単䜍でない堎合、プログラムでの扱いがシンプルではなく面倒耇雑になる傟向がありたす。

ILI9341のデヌタシヌトを芋るず18ビットカラヌRGB666が扱えるようですが、18ビットだずプログラムで扱いにくいため、赀Rず青Bの色玠ビットを1ビットづ぀削った16ビットカラヌRGB565が䞻に䜿われおいたす。

(3) ポリゎン方匏

ポリゎンずは、座暙に奥行きZ座暙の抂念を加えた䞉次元座暙系XYZの䞉角圢を単数から耇数描画するこずで、疑䌌3Dの映像を2D画面に衚瀺するテクノロゞヌです。

䞀般的には䞉角圢1぀1ポリゎンずいう単䜍で衚し、矩圢くけい四角圢を衚瀺するには2ポリゎン必芁です。

ただし、セガサタヌンの堎合はスプラむト矩圢を倉圢させおポリゎンを衚珟しおいたため、矩圢1぀1ポリゎンだず考えられたすが、この方匏は残念ながら䞀般化されなかったようです。個人的にはサタヌン方匏のポリゎンの方が盎感的で扱いやすいず思いたす

ポリゎンの衚面に矩圢の画像を貌り付けるこずテクスチャマッピングもできるため、2ポリゎン+テクスチャマッピングにより2Dのキャラクタパタヌンを衚瀺するこずもでき、頂点座暙を曎新するこずで拡倧瞮小、回転、倉圢などを自由自圚に行うこずができたす。

数千䞇〜数億ずいった膚倧な数のポリゎンを甚いるこずでリアルな疑䌌3D空間を再珟できるメリットがある䞀方、ずお぀もなく膚倧な量の蚈算が必芁になるデメリットがありたす。

ポリゎン方匏には、このデメリットの圱響で「描画性胜」ず「消費゚ネルギヌ」ずいう2぀の倧きな課題がありたす。

ポリゎン方匏の描画性胜面の課題解決のため、衚瀺に必芁な蚈算䞻に行列挔算を高速に行うこずに特化したGPU; Graphics Processing Unitず呌ばれるICチップNVIDIAのGeForceシリヌズ等が進化するこずになりたした。

GPUの進化は、䞀定の分野でスヌパヌコンピュヌタのフロップス単䜍時間での浮動小数点数の蚈算量を瀺す性胜指暙を匕き䞊げるこずにも圹立ち、䞻に膚倧な量の行列挔算を必芁ずする深局孊習ディヌプラヌニングず呌ばれる特城抜出アルゎリズムChatGPTなどで䜿われおいるテクノロゞヌの分野などに貢献しおいるようです。

しかし、膚倧な量の蚈算を実行するには圓然ながら倚くの゚ネルギヌが必芁になるため、膚倧な電力消費ず冷华蚭備が必芁になるこずで、極めお倧きな環境負荷が掛かる課題がありたす。

もちろん、環境負荷の課題はGPUスパコンに限った話ではなく、シンプルに「たくさん蚈算するにはたくさん゚ネルギヌが必芁」ずいうこずで、その課題を解決する研究も盛んに行われおいるようです参考が、珟状では富岳ふがくを1時間動䜜させるのに4人䞖垯家庭の消費電力の玄75ヶ月分皋床の電力が必芁になる参考らしいです。

スパコンを觊った経隓がある人はかなり限られる私も觊ったこずがないためむメヌゞし難いのですが、スマホでゲヌムをプレむするず凄たじい勢いでバッテリヌ残量が枛り、端末がホットカむロのように熱くなるアレが䜕䞇倍かのスケヌルになったものみたいな感じだず思われたす。

珟代のコンピュヌタのチップセットには圓然のようにGPUが搭茉されるようになったため、ポリゎン方匏が最もポピュラヌなゲヌムのグラフィックス描画方匏の地䜍を獲ったず蚀えるかもしれたせん。

ポリゎンの正確な理解には高床な数孊知識が必芁≒孊習コストが高いずいう難点がありたしたが、その課題は開発ツヌルSDK; Software Development Kitが克服しおいるようです。

か぀お、Unityず呌ばれるSDKが流行っおいた時期があり、Unityを甚いれば3Dに関する数孊知識がれロの人でも簡単に3Dのゲヌムを䜜るこずができたした。珟圚の䞻流はUnreal Engine

FlashやUnityなどのクロヌズドで䞍自由なSDKに䟝存するのはずおもリスキヌなので、3Dゲヌムを創りたかったら必芁な数孊知識を習埗しおもっずオヌプンで自由なSDKOpenGLずかを䜿うべき 

 などず、3Dのゲヌムに党く思い入れが無く、3Dプログラミングの習埗を断固ずしお拒吊しおきた私が偉そうに蚀っおも説埗力が無いかもしれたせん。単玔に3Dは酔うから嫌い

「3Dなどいらぬず、3Dを極めおから蚀えホ !」

ず蚀われれば返す蚀葉もありたせん。

ポリゎン方匏 = 排陀

リリヌス圓初の東方VGS実機版のSDKvgssdk-picoが提䟛するグラフィックス描画機胜VGS::GFXは、ビットマップ方匏のみで、キャラクタパタヌン方匏ずポリゎン方匏を省略しおいたす。

ポリゎン方匏は意図的に省略排陀したした。

ポリゎン方匏に察応した方が創れるゲヌムの幅が広がるのは間違いないず思いたすが、ポリゎンが無ければゲヌムが創れない蚳ではないので䞍芁かなずいうこずで。

もちろん、コスト面の郜合ずいう合理的な事情もありたす。

ただし、ポリゎンぞの情熱があれば合理性などガン無芖しお採甚したず思うので、結局のずころは奜みの問題だず思われたす。そもそも、個人でゲヌム機を創ろうずいう発想が非合理の塊ですし

キャラクタパタヌン方匏 = 採甚

䞀方、キャラクタパタヌン方匏のメリットは、凊理性胜が䜎いRP2040でゲヌムを開発する必芁がある東方VGS実機版には必須だず考えられたす。

ですが、䜕より私にはキャラクタパタヌン方匏ぞの情熱があるので、合理性云々に関係無くコレを倖すこずは䞍可胜です。

ただし、そのために専甚のICチップVDP; Video Display Processorを远加するこずは東方VGS実機版では出来ないので、VDPを゚ミュレヌションしたものをvgssdk-picoに搭茉するこずにしたした。

もちろん、専甚ICチップを自前で䜜る方が実甚性はさおおきロマンがあるず思いたすが、VGSは量産化されおいお流通量が倚い安䟡に調達ができる既成のICチップのみ䜿う方針です。

ですが䞀応、ASIC、FPGA、CPLDなどでICチップ化しやすい蚭蚈にしおみた぀もりです。

私はそっち方面は完党に専門倖なので、実際にICチップ化しやすいのかは定かではありたせんが、過去に幟぀かのゲヌム機゚ミュレヌタを䜜っおみた時の知芋を基瀎に蚭蚈しおいるので「恐らく倧䞈倫かな」ず想像しおたす。

VGS::VDPの蚭蚈思想

VGS::VDPの蚭蚈思想はメガドラむブのVDPに寄せおみた぀もりです。

もちろん、完党に同じものにするのではなく、RP2040で適床なパフォヌマンスず最適な゜フトりェア生産性が埗られるようにする芳点でれロから蚭蚈したした。ARMのCPUが6502にむンスパむアされお䜜られたずいう話をどこかで聞いたこずがありたすが、文脈ずしおはだいたいそれず同じだず思われたす

たた、埓来のビットマップ方匏のグラフィックス機胜VGS::GFXを眮き換えるのではなく、それず共存した圢でキャラクタパタヌン方匏のVDP゚ミュレヌタVGS::VDPを新蚭しおいたす。

VGS::GFXはMSX2のコマンドV9938の機胜に近いものがあるのでMSX2盞圓のパ゜コン的なグラフィック衚珟ができ぀぀、VGS::VDPでメガドラむブのようなゲヌム的なグラフィック衚珟も可胜 ずいう䜕ずも奇劙なゲヌム機になりたした。

本圓は画面いっぱいのサむズ240x320ピクセルでVGS::VDPの画面を衚瀺できるようにしたかったのですが、ハヌドりェアの制玄RP2040の凊理性胜ずメモリサむズの制玄の関係で、最倧でも192x240ピクセル䞋図赀枠の範囲で20fps皋床の性胜が限界でした。

VGS::VDPの画面サむズの限界
192x240ピクセル

なお、VGS::VDPの仕様自䜓かなりフレキシブルな蚭蚈にしおおいたので、もっず高性胜なSoCを䜿えば党画面で衚瀺したり60fpsにするこずも可胜です。VGS-Zeroの垃石

ゲヌムのメむン画面動的な郚分はVGS::VDPで描画し぀぀、スコア衚瀺やステヌタス情報などほが静的な郚分はVGS::GFXで描画するような䜿い方を想定しおいたす。

VGS::VDPのVRAM

VGS::VDPのVRAMには、先述の「(1) キャラクタパタヌン方匏」で解説したパタヌンテヌブルptnずネヌムテヌブルbgの他に、scrollX、scrollY、oamずいう謎の領域がありたす。

VGS::VDPのVRAMの構造

芋る人が芋れば党然謎ではない名前だけで機胜がむメヌゞできるものず思われたすが。

スクロヌルscrollX, scrollY

VGS::VDPの画面サむズは、先述の通り最倧192x240ピクセル幅×高さ×2≩90KBずいう仕様ですが、ネヌムテヌブルはピクセル換算するず512x512ピクセルです。

぀たり、ネヌムテヌブルが衚瀺画面の䞊限よりもかなり広倧なサむズになっおいたすが、これは蚭蚈ミスではありたせん。

scrollXずscrollYでネヌムテヌブル䞊の描画開始基点を指定できたす。

scrollX, scrollYの指定むメヌゞ

䟋えば、scrollX・scrollYの加算・枛算ずレンダリングをルヌプさせるこずで8方向のスムヌスなスクロヌルをするこずが可胜です。

たた、範囲倖座暙の描画はルヌプする仕様です。

ルヌプ描画のむメヌゞ

これは、兞型的なゲヌム機に搭茉されおいるVDPファミコンのPPU、スヌパヌファミコンのS-PPU、セガマヌクIIIのMODE4、メガドラむブのMODE5などに搭茉されおいるハヌドりェアスクロヌル機胜ずほが同じ仕様です。

ただし、スプラむトの描画凊理を単玔化高速化したかった関係でH-SYNC割り蟌み特定のスキャンラむン䜍眮で発生させる割り蟌みをサポヌトしおいないため、ラスタスクロヌルを掻甚した疑䌌3Dレヌシングゲヌム等の実装はVGS::VDPでは困難かもしれたせん。

スプラむトoam

OAMObject Attribute Memoryずは、スプラむトのレコヌド情報を栌玍する構造䜓で、VGS::VDPのOAMには座暙X, Y、パタヌン番号、ナヌザ情報の3皮類の属性がありたす。

VGS::VDPのOAM構造䜓

スプラむトずは、任意のキャラクタパタヌン※VGS::VDPの堎合はBGのキャラクタパタヌンず共甚を任意の座暙ぞ動的に衚瀺できる機胜で、䞻にゲヌムのキャラクタ描画に䜿われたす。

VGS::VDPが提䟛するスプラむト機胜は、兞型的なゲヌム機が提䟛するスプラむト機胜ず抂ね同じ仕様です。

兞型的なゲヌム機のスプラむト機胜ずの違い

  • 衚瀺属性

    • スヌパヌファミコンやメガCDのスプラむトには拡倧瞮小、回転、半透明などの機胜があるのに察し、VGS::VDPのスプラむトにはそれらがありたせん。メガドラむブのスプラむト盞圓

    • 兞型的なゲヌム機のVDPでは衚瀺属性でvisible/hiddenを指定する仕様になっおいたすが、VGS::VDPの堎合はパタヌン番号に00x00を指定するず非衚瀺パタヌン番号0はスプラむトずしお利甚䞍可ずいう仕様になっおいたす。

  • 氎平䞊限

    • 兞型的なゲヌム機のVDPのスプラむト機胜には氎平䞊限ずいうハヌドりェア䞊の制玄があり、ファミコンならスキャンラむン毎氎平方向に最倧8枚※スヌパヌファミコンなら32枚、メガドラむブなら20枚たでしかスプラむトが描画できず、氎平䞊限を超える優先床が䜎いスプラむトは描画が省略される特城がありたす。

    • VGS::VDPのスプラむトには氎平䞊限が無い※無い方が高速に描画できるため、256個䞊べお描画しおもチラ぀きたせん。

  • 色数

    • キャラクタパタヌンに指定できる色数は透明色を含めお最倧65,536色スヌパヌファミコンやメガドラむブはパレット方匏で、1枚のキャラクタパタヌンに䜿甚できる色数は透明色を含めお最倧16色です。

    • 個人的には16色䜿えれば十分だず思っおいるのですが、パレット方匏16色よりもハむカラヌ方匏RGB565の方が描画凊理を高速化できるため、ハむカラヌ方匏を採甚したした。

    • VGS::VDPの堎合、スプラむトの色に00x0000を指定した郚分が透明色になりたす。

䞊蚘以倖の特城ずしお、OAMレコヌドにナヌザヌプログラムで自由に䜿える3バむトのナヌザ情報userずいう領域を持っおいたす。※セガマヌクIIIやゲヌムギアのOAMにも䌌たような領域がありたす

これは、RP2040が32bit CPU䞔぀厳密な4バむトアラむメント構造なので、数倀型は4バむトで持たせるのが最も凊理効率が良く、その関係で頻繁な蚈算凊理が必芁な座暙倉数を4バむト敎数intにしおいたすが、パタヌン番号は冗長なレンゞチェックを䞍芁にする為笊号なしの1バむト敎数にしおいるため、3バむト分のバりンダリ領域冗長領域が発生するこずになり、折角だからその領域をナヌザプログラムが自由に䜿える倉数領域ずしお明文化しおみた圢です。

たった1バむトでもOAMにこういった冗長領域があるだけで助かる堎面が倚々ありたす。実際にファミコンでゲヌムを創っおみた時に欲しいず感じたので入れおみたした

もちろん、䜕メガバむトもの広倧なRAMが自由に䜿える昚今のSoCでは䞍芁な配慮ですが、RP2040が扱えるRAMは264KBしかないか぀、その半分以䞊をVGS SDKが専有しおいるため、こういったメモリを節玄できる配慮は必須だず考えおいたす。

スプラむト機胜の定矩

VGS::GFXが内郚的に利甚しおいるTFT_eSPIにも「TFT_eSprite」ず呌ばれる機胜があり、TFT_eSPIのラッパヌクラスであるVGS::GFXにも同じ機胜があるのですが、VGS::VDPのスプラむト機胜ずの混同を避けるため、VGS::GFXではこの機胜のこずを仮想ディスプレむ機胜virtualDisplayず呌んでいたす。

そもそも、スプラむト盎蚳するず劖粟ずは、1978幎にアタリ瀟により考案されたものが基瀎になっおいたす。

2.6 スプラむトの時代1980幎代
1978幎、衚瀺物の䜍眮座暙ず絵柄の番号をCPUが曞き蟌むだけで所望の絵柄をハヌドりェアが衚瀺する業務甚ゲヌム独自の「スプラむト衚瀺方匏」が米囜Atari瀟で考案された。

業務甚ビデオゲヌム衚瀺技術の倉遷より抜粋

私は様々なゲヌム機が搭茉しおいるスプラむト機胜を芋おきた結果、スプラむトの機胜芁件を次のように定矩したした。

次の1〜4を党おを満たすものを「スプラむト機胜」ず呌ぶ
1. 座暙ずパタヌン番号を含む属性情報テヌブルOAMを持ち
2. èƒŒæ™¯ç”»é¢ãŸãŸã¯å‰æ™¯ç”»é¢ãšç‹¬ç«‹ã—た画面レむダに察し
3. å‹•的にキャラクタパタヌンを
4. 最倧でOAMレコヌド数ず同数描画できる機胜
だだし、条件4はハヌドりェアリミットによる省略を認める。

SUZUKI PLANビデオゲヌムの定矩より抜粋

TFT_eSpriteは私が定矩するスプラむトの機胜定矩に合臎したせんが、仮想ディスプレむ機胜ずしおはずおも有甚なので、名前を倉えお残すこずにしたした。

䜕故、TFT_eSPIの䜜者さんがこの仮想ディスプレむ機胜を「スプラむト」ず呌ぶこずにしたのか ずいう点がずおも興味深いです。もしかするず、珟代におけるスプラむト機胜の䞀般定矩が倉化しおいるのかもしれたせん。

そしお、レトロなゲヌム機ばかり研究しおいる私が時代遅れな筈orz

C/C++でゎリゎリ扱えるVDP

VGS::VDPはC/C++で凊理を蚘述する前提の仕様になっおいたすが、C/C++でVDP凊理が簡朔に蚘述できるずいう点がメリットずしお倧きいかもしれたせん。

これには、ゲヌム機の歎史的な事情が関係したす。

昚今のゲヌム機にはLLVMが搭茉されおいるず思われる搭茉しない理由が無いず思われるので、C/C++に限らずRust等の様々なプログラム蚀語でプログラムを蚘述できるものず思われたす。

しかし、キャラクタパタヌン方匏のVDPが党盛期だった頃のゲヌム機スヌパヌファミコンやメガドラむブは、凊理性胜的な事情でただオヌルマシン語アセンブリ蚀語のみでのゲヌム・プログラミングが䞻流だったず考えられたす。

そしお、その次䞖代ゲヌム機に圓たるプレむステヌション1994幎以降、ゲヌム機の画面描画はポリゎン方匏が䞻流になり、キャラクタパタヌン方匏のVDPは廃れたした。

ちなみに、プレむステヌションポリゎン方匏䞖代あたりからは流石にC蚀語が䜿われおいただろう ず安盎に思っおいた時期もあるのですが、セガサタヌン版「ナむツ」をプレむステヌション2に移怍したこずを蚘した蚘事にセガサタヌン版ナむツはオヌルマシン語で䜜られおいた旚が語られおいたす。SH-2はRISCなのにフルアセで組めるのか😅

圓時の䞊叞でありナむツの生みの芪でもある氏から「ほんずに䞊海チヌムでできるの党郚アセンブラ蚀語で組んであるし、しかもサタヌンのツむンCPUをフルに䜿いたくっおいるよ。」ず嫌味を蚀われるも、「たあ芋おお䞋さい」ず豪語し぀぀説埗。

ナむツずの思い出より抜粋

そのような背景事情から、高玚蚀語C/C++でキャラクタパタヌン方匏のVDPを扱う家庭甚ゲヌム機向けプログラムを蚘述した経隓があるゲヌムプログラマは少なかったものず考えられたす。

もちろん、X68000蟺りならC/C++で蚘述するこずも出来たかもしれたせんが、CISCアヌキテクチャであるMC68000のマシン語は高玚蚀語䞊に扱いやすいこずもあり、特に性胜が求められる堎面が倚いVDP関連の凊理はマシン語で蚘述するのが䞻流だったず考えられたす。

たた、同様にMSXにもC蚀語がありたしたが、MSXのCPU「Z80」は息が長かったこずもあっお技術曞が本屋に豊富にあったこずに加え、Cコンパむラは数䞇円皋床する高玚品だったので、「初心者はBASIC」「䞊玚者はマシン語」ずいう極端な二極化をしおいたのではないかず考えられたす。

぀たり、キャラクタパタヌン方匏スプラむトありのVDPの制埡凊理をC/C++でゎリゎリ蚘述するプログラミングスタむルは、キャラクタパタヌン方匏を知らない若い珟圹䞖代のゲヌムプログラマだけでなく、キャラクタパタヌン方匏を懐かしむロヌトルなゲヌムプログラマにずっおも新鮮かもしれたせん。

私はZ80がそこそこ埗意自䜜の゚ミュレヌタを䜜れる皋床なので、Z80のオヌルマシン語でゲヌムのプログラムを曞くこずも䞀応できたすが、それでもやはりC/C++の方がプログラミングし易い生産性が高いず思っおいたす。マシン語プログラミングにはマシン語プログラミングの良さや面癜さがあるので、生産性の話を抜きにすればオヌルマシン語でのプログラミングもオススメしたいずころではありたすが

最近のむケおるナりいゲヌムプログラマならRustかもしれたせんが、RP2040の性胜だずLLVMバック゚ンドを動かすには性胜的に少々キツむかなず。

RP2040が公匏にサポヌトしおいるプログラム蚀語はC/C++ or ÎŒPythonずのこずなので、RP2040でゲヌムプログラミングをするなら事実䞊C/C++䞀択だず思われたす。

IoT甚途ならΌPythonの方がサンプルが倚くお良いかもしれたせんが、VGS; Video Game SystemはIoT機ではなくゲヌムを創るためのシステムなので、SDKはC/C++のみです。

2. 効果音の再生

箄8幎前2015幎10月ごろの私曰いわく、

音楜ではなく、効果音に察する拘りは結構あるのですが、それは恐らく普通の人の感芚ず倧分違いたす。同僚などに、私のゲヌム効果音に察する芋解を熱匁するず、倧抵の人は「䜕蚀っおんだコむツ」みたいな顔をしたす。私の芋解は、たず「ゲヌムずは効果音である」ずいう所から解説が始たりたす䞭略。

蚘事「東方BGM on VGSができるたで」より抜粋

ずのこずです なるほど🀔

長幎ブログを曞き続けおいるず、かのような怪文曞が残り続ける堎合もあり、ずおも愉快な気分になれるのでオススメです。黒歎史もたた歎史

最近の流行りはブログではなくYouTubeでVLOG動画ログかもしれたせんが、動画よりもテキストの方が短時間で読み返せお怜玢も簡単なので、蚘録目的なら動画化よりも文章化がオススメです。

他にもYahooブログ、ニコニコのブロマガ、Google+など、珟圚ではサヌビス終了しおいる数倚のテキスト系クラりド・プラットフォヌムで様々な怪文曞を投皿しおきたしたが、残念ながらそれらの倧半を芋るこずはもう出来たせん やったぜ☆

党おのクラりドサヌビスは氎蒞気の塊に過ぎないので、将来的に党お霧散する前提で䜿っおいたす。本圓に残したければWordPressなりで自分甚のサヌバを建おるべきですが、怪文曞投皿家曰く「消えるから矎しい」ずのこずで雲圹務クラりドサヌビスを奜んで䜿っおいたす。

Bloggerは、あのR.I.P.メヌカヌこずGoogle運営なのに未だに続いおいたす。テキストベヌスだからランニングコストが安い割にAdSense広告ずの盞性も良いずいうこずなのかもしれたせん。知らんけど

䜙談はさおおき、ゲヌムにおける効果音は物凄く重芁で、仮にBGMが無くおも「効果音さえ適切に鳎っおいればゲヌムっぜい雰囲気は成立する」ず今でも思っおいたす。

なので、ゲヌム開発する時に「BGM or 効果音」の究極の二択を迫られた堎合、やはり効果音を取りたす ず、東方VGSBGMのみ効果音無ししかヒット䜜が無い私が蚀っおも説埗力が無い気がしないでもないです。

「BGMなどいらぬず、BGMが無いゲヌムをヒットさせおから蚀えホ !」

ずいう蚳で、本題の効果音機胜を付けたした。

VGSの堎合、波圢メモリ音源VGS::BGMは音楜の再生専甚で、効果音再生は22050Hz, 16bits, モノラルの任意PCM圢匏で再生する仕様これは初期のVGSの頃から同じ仕様です。

凊理性胜の関係で耇数の効果音を同時再生合成再生するこずはできず、効果音1を再生䞭に効果音2を再生するず効果音1の再生がキャンセルされお効果音2の再生が始たる圢になりたす。

3. ゲヌムパッドWIP

ゲヌムパッドの察応に぀いおは、郚品集めの段階なのでただできおいたせん。

いいなず思ったら応揎しよう