題名:『初心者による初心者の為にならない256色プログラム雑記』

<前書き>

 皆様こんにちは。私、電気通信大学X680x0同好会というサークルに所属しております、関と申します。非常に拙い文ではありますが、最後まで目を通して頂ければ幸いです。

 今回は、浅はかながらも私自身が、日常的に触れているプログラミング、特に256色におけるゲームプログラミングについて語らせて頂きたいと思います。但し、何分この分野にかけては、まだまだ未熟極まりない若輩者です。先達の皆様には呆れ返るほど当然と思われる事が含まれているはずです。造詣の深いプログラマーの方々は鼻で笑い飛ばして読み飛ばすなりご自由に。ゲームプログラム初心者やこれからゲームプログラミングをしようと志している方は、この文章を反面教師として煮るなり焼くなりしても構いませんが、炒めたり漬け込んだりはしないで下さい

(本文中で(注)の付いている部分は後述の『人畜有害解説(ビール味)』で説明してあります)
<<本文>>

■知りません256色までは

 ゲームプログラムを組むという目的の元、プログラムの勉強を始めた私の手元にあったもの、それはVisualC++(以下VC++)、とその入門書。高校時代の数ヶ月、僅かにCの文法を齧っただけの私には、画像表示やキーボードからの入力、音楽の演奏などの知識は、脳味噌に1ピコグラムもありませんでした。言うなればHELLO WORLDのみです。そんな無知蒙昧な私は、VC++と、その入門書に書いてあるビットマップ(注1)の処理で、ゲームを作ろうと考えていたわけです。今考えれば、別に無理な話でもなく、ゲームの種類によっては、VC++でMFC(注2)をふんだんに使ってゲームを作ることも可能だと思います。ただ、『リアルタイムで動き回るアクションゲーム』を作ろうとしていた昔の自分には、臍の緒で紅茶が沸くこと甚だしい限りです。なにせ、フルカラーのビットマップをMFCのOnDraw関数、画面の描画命令の際に転送することを繰り返していたのですから。それでも当時は転送の遅さや重さよりも、表示できたことに対する嬉しさが先行していました。若いって素敵ーです。

 この様に、矢印キーを押して動く画像に、キャーキャー喚いていた単細胞生物は、ある日DirectXを使用したゲームプログラミングの本(注3)を購入し、その本の中で256色モードを知りました。おそらく順序が逆です。


■256しょくがあらわれた

 256色ってなんでしょう。8bitカラー?ニゴロ?この『256』という数は8bitで表現できる、2の8乗で表現できる0〜255という範囲を示しているようです。画像の表示の際に、1677万色中の256個の色に、0〜255までの番号(インデックス)を付与し、画像等の色データとして、この番号を使用します。これによって、画像1ピクセルのデータが8bit、1byteで収まるそうです。表示の際に、この8bit、1byteというサイズは処理速度が速いため一般的(前述の本参照)らしいです。(ビデオメモリ(注4)や転送に関する云々は、私には説明できるほど知識がないので、割愛させて頂く事をご容赦ください。)

 購入した本には、このような256色モードを使用したDirectXによるプログラミングが示してあったのです。そしてここから、私の血の滲まないような256色によるゲームプログラミングの1年強(注5)が始まったわけです。


■疑惑の256色

 1画面に256色と限られた色数の中で、如何に遣り繰りするかがネックである256色モード。けれども、この256個の色全てが使えるわけではなく、256個の色を格納するパレット(後述)の先頭、末尾にはWindowsがシステムカラーとして握って、決して離そうとしない番号の領域があります。余りの我侭っぷりにこちらも我侭の一つも言いたくなりますが、プログラム中でパレットの内容を変えると、他のアプリケーションのウィンドウ枠の色が目まぐるしく変化しまう事を考えると、非常に面白いので致し方ないのかもしれません。

 しかし、この安全措置はアプリケーションがウィンドウモードの際のみ適用されるらしく、フルスクリーンモード(注6)でゲームを作る分には問題ありません。但し、先頭の0番と末尾の255番はどうしても変更できないようです。私は以前、これらの番号を変更しようと試みました。あたかも変更を前提としたかのプログラムを組み、判定で失敗、無限ループ、「フリーズだよドラえもん(注7)」と心地よく青画面を眺めた覚えがあります。これから256色でゲームを作ろうとしていらっしゃる方は、注意しましょう。けれども、決して利用できないわけではないので、カラーキー、透過色として設定しておくのが良いかもしれません。


■あの日の256色の特権

 扱うデータが小さいことで処理が速くなる、それ以外の利点は256色には無いのでしょうか?私が知っている範囲では、前出した『パレット』の使用が利点の一つにあります。画面に表示されている色は、それぞれに関連付けられた番号(インデックス)で示された色の集合、パレットによって管理されているそうです。その為、パレット内部の色を変更するだけで、関連付けられたインデックスをデータに持つピクセルの色を変化させることができるそうなのです。これで何ができるかといいますと、ゲーム上でキャラだけ、背景だけの色を変更することが容易にできます。フルカラーやハイカラーの場合は画像のピクセルデータが色のデータそのものなので、表示する画像全体を走査してデータを変更しなければなりませんが、256色の場合は最高でも256回データを弄くってやるだけで良いわけです。対戦格闘ゲームで2Pカラー(注8)なるものがありますが、ハイカラーやフルカラーの画像で実現する方法がわかりません。教えてほしいぐらいです

 このパレットを変化させる手法を用いることで画面全体をフェードイン、フェードアウト、グレースケール(注9)、ネガ反転等の効果が出せます。


■256色と半透明とリコール隠し

 画像表示、キー入力、BGM、SEの演奏と基本的な部分の実装を済ませた頃の私は、開始コドンよりも矮小な満足感に浸りきっておりました。けれども、世に出回る大半の256色仕様のゲームは、ビジュアル面において明らかに優れた処理を行っています。それは所謂、(擬似)半透明処理(注10)というものです。ここで言う半透明処理とは、画像を描画する際、描画前に存在した部分が透けて見えるように見せる処理です。処理の内容としては、描画元の色と描画先の色を混合して表示する、という至って判りやすい手法ですが、256色でこの処理を行おうとすると、ただ色の判定と最終的な表示色を算出するだけでは駄目なのです。例えば、最終的に画面に表示したい色を、描画元と描画先を1:1で混合した色にしたい場合、先ずは転送元と転送先の色の平均を取ります。しかし、この算出した平均の色と正確に一致する色が、0〜255の番号の中にあるかというと、必ずしもそうとはいえません。むしろ無いほうが普通です。当初の私は、この時点で無い頭を無理に使おうともせず、半透明にシカトを決め込んでおりましたが、時は12月、師走だったので、せっかくだから(注11)半透明処理を考えてみることにしました。

 パレット内に存在しない色をどうやって得るか?

結論、得なければ良い。

というわけで、もっとも『それっぽい』色、近似色をパレット内から探し出して表示すれば良いわけです。よって厳密な意味で半透明ではなくなるため、接頭語に擬似だの似非だのが付くというわけです。


■256色と半透明とグローバル主義

 半透明処理を組み込んだ如きに馬鹿◎出しで有頂天になっていた私ですが、それでもまともに動くようにと、僅かばかりの改良を施しました。と言っても、アセンブリ(注12)とか使ったわけでは有りません。リアルタイムで半透明色の算出なぞしておりますと、固まったハニーシロップが、ジワリジワリと、出てくる様を見ているようなマッタリ速度に低下してしまいます。そこで、配列等でテーブルを作成し、転送元インデックス、転送先インデックスの組み合わせ結果を事前に保持しておく事にしました。表示の際には両者のインデックスを調べ、テーブル内から指定のインデックスを持ってくる、という具合です。


■256色と半透明とターボレンジャー

 私の場合、半透明の計算がヘッポコですから、奇妙奇天烈な色(注13)が偶に現れたりします。但し、概ね期待以上の結果を出していたので個人的に満足しておりました。しかし、幸せはそう長く続かなかったのです。(知ってるつもり!!!!!!!(ドラゴンボール仕様)風に。)半透明の組み合わせ結果を、予めファイルにセーブしていたのですが、考え無しに半透明を乱用していたおかげでファイルの容量が『640MB以上』に成ってしまいました。流石に背景色を転送元に含めていたのは、菌糸類並みの頭脳を誇る私ならではの所業ですが、その様な幼稚な失敗部分を削除したとしても、パレットの組み合わせに比例して半透明色のテーブルは千差万別に変化してしまい、ファイルの総量は尋常では無くなってしまったのです。


■世紀末だよ256色

 21世紀もある意味最期が近付いて来ています。時代の流れに安直に従って、私も256色とは見切りを付ける事にしました。所謂、決別とか国交断絶とか狂牛病とか言われる行動です。1年強お付き合いさせて頂いた256色とは金輪際目も合わせず、手を繋ぐ事になったわけです。なぜでしょうか。一言で言うならパブ・・げふん、げふん・・詰まる所、Direct3Dによるアルファブレンディングによる半透明処理の方が美麗であり、且つ、擬似半透明に起こるような弊害が生まれない為、私は無節操にもDirectX8の尻馬に乗っかることにしたのです。

 ちなみに、DirectX8はSDKには、パレットに含みを持たせて書いている部分がある分際で、256色を切り捨てている所が、私にはさっぱり判りません(注14)が、要はアメリカ人とは優良人種だ、という意味なのでしょう。

 Direct3Dを使用すれば、加算だろうが減算だろうが半透明も思いのまま。(但しハイカラー以上が必要ですけど。)こうなると、もはや256色にパレットしか優位性はないのでしょうか?いえ、寧ろパレットすら、その存在意義が薄くなっているのです。パレットアニメーションのような妙技は『おそらく』難しいでしょうが、単純なフェードイン、フェードアウトぐらいは、Direct3Dにおけるライティング処理(注15)や頂点色の変更で簡単にできるでしょう。今後はハイカラー以上のゲームが続々と登場してくるのではないでしょうか。


■立て!立つんだ256色!(無責任に)

 前節では256色の衰退っぷりを語ったような口ぶりでしたが、私としては、まだまだ256色はゲームとして頑張れると思います。アルファブレンディングやライティングが綺麗さで256色を圧倒していたとしても、その反面、処理速度の点で256色はまだまだ優位を保っています。それに、ゲームを普及させることを考えると、いくらマシンのスペックが日増しに進歩しているとはいっても、あまりゲームをやらないユーザーの間には、Direct3Dの処理を存分に発揮できるようなマシンは普及していないと思われます。それに、今までゲームをやってきた方々も、256色という仕様が主体だったわけですから、全員が全員、財布の紐を緩めるわけではないはずです。(・・某対戦格闘の為にビデオカードを新調した方はいるでしょうけど。)まだまだ256色ゲームのシェアは安泰です。

 加えて、ハイカラー以上が優勢を誇っているのはPCの話であって、プラットフォームによっては、パレットによって色数を管理するゲーム開発もあるわけですから、一概に256色の未来に悲観的である必要もなさそうです。グラフィック先行のゲームを否定したり、懐古主義(注16)に走ったりする気はありませんが、「誰にでも遊べて面白いゲーム」ならそれに越したことは無いような気がします。半透明だのポリゴンだの使わなくてもゲームはできるわけです。・・彩りは欠けますけどね


<後書き>

 生まれて初めて触れたプログラミング言語がC言語、TurboC。printfやらscanfやらと共に、線分を引きまくって、幾何学的な模様ばかり表現していた時代が終わると、拙い手つきでビットマップを表示し、パレットを弄くり始め、アレヨアレヨとライトだの頂点だのマテリアルだの。二兎追うものは何とやら。もう少し腰を落ち着けるべきなのではないか、と思ったりしなくもなくもありません。移り気なのは現代人の持病か、はたまたミトコンドリアの策略か。真相はお天道様とラスプーチンのみが知ると言う事にしておいて、今はVRAM32MB以上を積んだビデオカードが普及することを祈りつつ、Xファイルのお勉強でもしようか、などと嘘ばかりついておきましょう。

 最後まで読んでくださった方ありがとうございます。気分的に最後まで読んだ方もありがとうございます。ありがとう序でに、すっ飛ばした方もありがとうございます。それではみなさんごきげんよう。提供は、おはようからおやすみまで暮らしに居座るライオン、でした。嘘です。


<注釈『人畜有害解説(オイスターソース)』>

注1:『ビットマップ』

入っているデータ自体は、色データまんま、無圧縮で判り易いのですが、データの並び方がなにやら微妙に違います。おかげで読み込みの際にステッキーな色で表示されることもしばしば。私を含めゲームプログラミング初心者の為に、いろんなファイルフォーマットを判りやすく解説してくれる『書籍』はないでしょうか。GIFとかMP3とか含めてね。

注2:『MFC』

アメリカのド偉い会社が、VC++にくっ付けたアプリケーション開発に大層役立つクラス群らしいのですが、VC++の機能自体、初心者の私にとってはブラックボックスも良い所なので、実は気軽に使えない代物です。開発用ツールを作る際には、GUIとしての部分が大変役に立っているのですけれど、ソースの至るところに宇宙語が吐き出されるので、不安で仕方ありません。

注3:『DirectXを使用したゲームプログラミングの本』

正式には『DirectXゲームプログラミング入門 Jason Kolb著 アクロバイト監訳 インプレス発行』です。私共のサークル内での通り名が『黒本』である事が示すように、実に黒い本です。但し、見た目です。中身は至って普通のDirectXの本です。黒魔術とか爆発物の解説書ではありません。パレットやら256色やらを実用的な面で知りたい初心者の方は、読んでおいて損は無いと思います。個人的に、丁寧な説明と『一箇所を除き』真面目な文体に好感が持てる一冊です。但し、説明がネストしまくっていたり、サンプルプログラムの挙動が怪しかったりしますが、気のせいです。もしくは奇跡です。

注4:『ビデオメモリ』

本当に最近まで、私は普通のメモリと区別が付きませんでした。「VRAM?なにそれ?新しいバーチャロイド?」。こいつを積むビデオカードの性能如何がDirect3Dを使用したゲームにおいて明暗を分けます。偶にライティングが可笑しくなって文字通り明暗を分けたりします。

注5:『1年強』

共同でゲーム開発をしている製作者に「無駄」と言わせた1年強。すみません。

注6:『フルスクリーンモード』

ゲームを起動すると、アキレス腱が切れるような物騒な音と共にアプリケーションのウィンドウ領域が画面いっぱいに広がる『あれ』です。解像度自体をこねくり回しているため、フルスクリーンモードに入った途端にエラーで終了する事が多々あったりします。フルスクリーンモードでハングアップした時には泣くに泣けないので、笑いながらリブートしましょう。

注7:『フリーズだよドラえもん』

困ったときにはドラえもんです大して困っていないときにもドラえもんです。とりあえず付けておいても訴えられたりしないでしょう。同様に、『Ctrl+Alt+Deleteだよパパ』や『不正なメモリアクセスだよトニー』もあります。

注8:『2Pカラー』

最近では4つも5つもカラーがあったり、自分で色を決められたりと様々です。本来は同キャラ対戦時の混乱を防ぐ目的なのでしょうけれど、今や個人の好みに合ったカラーの選択へと目的が発展している様に思われます。古くは配管工が亀をどついて金品を奪い合うゲームも、兄とか弟とか考えなければ、2Pカラーを使用した同キャラ対戦でしょうね。

注9:『グレースケール』

モノトーンで表現するわけですから、ある意味白黒のフルカラーです。誰か作らないんでしょうか。モノトーンのゲーム。256色ながら『階調だけはフルカラー』。演出として色相のみを変えればSF(サムライフィクション)みたいでカーコイーです。

注10:『(擬似)半透明処理』

本文でも書きましたが、あれば越した事ありませんが、無くても支障はないものだと思います。ただ、某256色対戦格闘の加算半透明処理は帽子が脱げる美しさです。私が半透明処理を手掛け出した本当の理由は、このEternalFigh・・げふん、げふん。

注11:『せっかくだから

流行語大賞に選ばれなかったのが残念で何よりですが、考えれば当然な程に一部においてのみ通用する最強の言霊です。一見、というかどう考えても、論理的に正しくない行動さえ、この言葉を唱えてしまえばあら不思議、なんでも正当化できます。但し、世間的には市民権は得ていないので、「せっかくだから」犯罪行為を起こすと法的に裁かれるため注意が必要です。他にも頭上に危険が迫った場合や、友達を呼んだり友達の安否を確認したりする際に使用する言葉がありますが、ここでは割愛させて頂きます。

注12:『アセンブリ』

現在の私のアセンブリ知識は、学校の講義で習ったものから進歩0μmです。『下手なアセンブリよりCの最適化』という言葉を鵜呑みにし、酷く重い処理を量産しつづけながら、日々CPUに厳しいプログラミングを行っております。単純なピクセル計算だったら使っておくべきなのかもしれません。

注13:『奇妙奇天烈な色』

火炎や爆発の内部に鮮やかな黄緑色が・・・炎色反応か?

注14:『DirectX8とパレットの偽装結婚』

本当に良くわかりません。以前256色がサポートされていた時代の名残でしょうか?

注15:『ライティング処理』

私の周囲では重い重いと実しやかに囁かれているライティングです。現在製作中のゲームで『引っ切り無しに』使っているので不安でなりません。『らいとまっぴんぐ』とかいうテクスチャの一種を使用すれば、より軽くなるらしいのですが・・・まあ、ポリゴンバリバリの3Dじゃないと意味無いんですけどねライティング。だから2Dの私は意味ゼロ。

注16:『懐古主義』

自分に関係無い限り、他人様の主張にとやかく言うつもりは有りませんが、懐古主義も偶には良いものではないでしょうか。主義だか主張だか趣味だかは、さて置いておき・・誰か、『いっき』とか『摩訶摩訶』とか『スパルタンX』とか『たけしの挑戦状』とか『クイックス』とか『オセロワールド』とか『マインドシーカー』とか『GAME WARE』とかで対戦格闘を作らないかなぁ、と不謹慎な妄想に耽っている今日この頃。


書いた動物は 電気通信大学X680x0同好会 で 代表 だったりする 関 宏之(オス・辛党)でした。