ゲームプログラムは描画部と計算部に分かれている話

 まあ俺は幼少期からゲーム&ウォッチで遊び小学校の頃からファミコンで中学からゲームボーイとゲーセン通い、高校は受験のためにいちど本とノートの勉強に入ったけど大学には落ちてゲーセンバイトで基盤と筐体をいじりながら2年後専門学校に入ってそこでようやく自分のパソコンを持ち、それからC言語とワードエクセルの使い方にコーレルなどの特殊なアニメソフトを与えられ、しかし先生より1年で出来るようになってしまい、大したことを教えてもらえないと思った俺は職員室に先生の本を見に行こうと入ってみると本もパソコンも何もなく、学校の近所の書店で買ったC++の入門書と専門学校の学生証で学割となったマイクロソフトビジュアルシープラスプラスVisualC++/VC++を買って自習して、それから二年は半分ほどサボって単位ギリギリで卒業し、国家試験(情報処理技術者二種、今でいう基本情報)にも通ったが、ゲーム業界を志望して大手メーカーにことごとく負けて大阪上本町の小さなパソコンゲーム会社で新人いびりを受けてから、出したソフトの受けが良く谷町六丁目ソフトハウスに転勤3年そこで勤めて富士通系の派遣SEとして関西の大手メーカー支社に立ち入って社内システムをメンテナンスする仕事をしてきた。

 だからプログラムを教えて欲しい、と言われると教えたことは無くて何から教えたものかと思うのだが、プログラムの教科書は市販されているし各種専門学校もある。それを無視して実務者から聞けば一発ではないかというのが既にナメていると思うのだが、教えられないというのもそれはそれでナメられて、あまり素人にナメられるのも別に仕事に支障はないが俺がムカつくので、ちょっとゲームプログラムを教えることにした。

 インベーダーやマリオなどのシューティング、ジャンプアクションはボタンを押せばキャラが動くわけだが、この手のゲームは描画系統と操作系統(座標系統)を持っている。そのため、まずは描画系統として画面についての知識がいる。昨今のLEDディスプレイで言うと、なめらかではあるが拡大すると正方形のLEDのカタマリで、画面の左上隅を0として1024*768の画面なら掛け算して約78万画素が表示されている。そして画素ひとつはRGBの光の三原色の照度で色を示していて、画像ファイルというのは大抵がひとつの画素あたりの赤の照度R緑の照度G青の照度B(Red,Green,Blue)の三つの数字をC言語で言うとint iとかlong lの整数型、VBならDim r as Integerで赤緑青の3つの数をセットにした色情報を画像の左上から右に進んで端で左一行分下に折り返し、右下までを配列としたデータ構造をしている。C言語で書くとなるとディスプレイドライバに照度を送ってゆくのだが、大抵のプログラミングはそれらの細かいモジュール群をまとめたオブジェクト指向でいう所の「ライブラリ」語源は図書館だがプログラム関数群の意味でグラフィクスライブラリというモジュールのI/Oを覚えて使うこととなる。簡単なフレームワークを使うと、ウインドウズ付属の「ペイント」で描いた絵をビットマップでファイルに保存(メモリ)して同じ絵をプログラムから関数を呼び出して表示できる。

 しかし絵を出すだけではゲームとは言えない。そこでゲーム機ならコントローラだが、パソコンならマウス、キーボード、そしてスマホならタップとまあ、スイッチON/OFFの簡単なデバイスならコンピュータの0・1と結びつけるのはやさしいが、マウスやタップは移動量や触れた範囲がベクトルで入る難しいI/Oとなる。しかしこれもフレームワークを使うとボタンの範囲を押したかという0・1に変換して、普通はそれを使ってゲームを作ることとなる。ボタンから受け取ったON/OFF(0・1反対か、1・0だね)を描画部の絵と連動させるために、メモリ(普通のプロブラムの話に戻すとint iやlong lにDim x as Integer)でビットマップを画面に出したところからコントローラでどれくらい動くのかの運動量を座標のX,Yベクトルに加減算して、それに基づいて描画更新をコンピュータの内蔵時計で測って、コントローラが押されたI/Oを次の描画更新までにベクトル分更新しておいて、その新しい座標に基づいて次の更新で絵の座標を変えるので、パラパラ漫画とかアニメの原理で絵が動いて見えるというカラクリだ。

 大抵のC言語の本には数値計算しか書かれていないし、ゲームプログラムの本を買っても絵がコントローラで動くところまで、だろう。ここからゲームとしての味付けのためにパズル要素であったり、冒険する地図というか世界であったり、敵キャラクターの移動アルゴリズムに踏みつけやショットの衝突判定などを書き込まなくてはならない。

 この辺の事が書かれた本がほとんど無いのは、そこを考えるのがゲームクリエイターの旨味であり、出来てしまうと売り物して良い製品だからだ。

 そこまで踏まえて、ゲームの作り方を教えて欲しいと言われると、ゲームと言っても様々で「まずあなたは何がしたい?」と問い返すこととなる。インベーダーやマリオなら、既に俺はGitHubなどのOSSで公開していて、勉強を自分でしている人はコピーして真似して改造して勝手に作っているように見受けられる。直接SNSで使っていいですかと尋ねてきたものもいるが「勝手にどうぞ、儲かったら何か奢ってね」と返してあるので、近寄る前にログを読んだ人も皆それに倣っていると俺は思っている。

 というか、教えて欲しいという人に昔は「Cプログラム入門」みたいな本を自分で買って読めと、教わる前に自分で勉強してから来いという立場を取ってきたので「教えてくれない」「冷たい」「偉そうにしてるだけの人」というレッテルを貼られてきたのだが、こうして毎日ブログを書いてOSS活動をしていても、自分からそれを知ろうとせずに名前を辿って本人である俺に問い合わせるのって、根本的に人だよりでそれなら売ってる奴を買って遊んだほうが良いと思うし、俺だって自分で作る以上に売られているものを買って遊ぶし、コピーは違法だと敬遠しています。そりゃ出来るよ、コピーだって。ただそれを売り物にしている人に失礼だと思うし、損害を与えていることにも気付いてほしい。有り体に言って悪意的なんだよな。

 そりゃゲームには悪者の敵キャラが出て来て、それを作って戦わせている以上は完全なる善の世界を提供しているわけではなく、役割的に悪も背負っているのかもだが、それ遊んであなた面白かったから自分でも作ってみたいってなったんじゃないですかと。

 ホントはインベーダーやマリオなどを書いた後にドラクエFFなども書こうと思っていたのですが、言いたいことを言ってある程度スッキリしたので、まあ意地悪しないで言っておくと、C言語の変数(メモリ)に入っているのが数値であることが分かると、まず自キャラを名前(文字列)HP・最大HP・こうげき・ぼうぎょというCで言うなら構造体、C++やC#にVBならクラスという数の列挙として、これは配列などの行列で持つのではなく、それぞれ変数名を割り当てて別々の値としてプログラムする。

 それをウインドウシステム、画像の原理で画面に窓を出して数値を数字の画像として画面に表示して、移動したら乱数でサイコロを振るように抽選して敵に出会うと(数当てゲーム成功とする)画面を切り替えて変数列を画面に表示してモンスターの絵を出す。このモンスターの絵がスライムのように弱そうなら、結びついているHPや攻撃力防御力は小さい値で、ドラゴンのように強そうなら大きい値を結びつける。もちろん、単に数字が結びついているだけなので弱そうなスライムに大きな値を持たせたり、ドラゴンなのによわっちぃというひねくれた世界を数で表現できるわけだが、それだとキャラ絵が大きいのに値が小さい不自然な世界となり、ある程度は画像としての見た目と関連付けられている値が自然な関係を持っているから世界が没入感のある表現になるのであって、プログラマーになると自由自在かというと、見る人の感情に合わせて納得感のある値を上手く設定してあげないと、売れないクソゲーになってしまう。

 個人的にドラクエFFで言うとFF6に参加したことがあるが納期が短く「どうしてウォーマンモスよりモーグリの方が強いんだろうね・・・。」と独り言をこぼしならCでプログラムを書いていると、そういうのはプログラムで値をひとつづつ書くのではなくエクセルでまとめて値を設定して、ファイルに絵と値を結び付けた数字列で一気に設定するので、最初の方に出てくるのが自キャラも弱いので小さい値、後の方に出てくるのが自キャラが強くなっているので大きな値で、最初の方のドラクエFFにあった、自キャラが段々と強くなって後の方になると大きくて強いモンスターと対峙するという大事な要素が抜け落ちて、ソフトの工業化が進んで流れ作業となり、意味のわからない大作ゲームになってしまったのだなFFは・・・。と思って悲しくなったところでこのゲーム制作講座(?)は終わりです。

 まあドラクエ系の説明はだいぶ端折ってしまったが、プログラムで描画以外の戦闘のルールを知りたければダンジョンズアンドドラゴンズ、トンネルズアンドトロールズ、ソードワールドなどのいわゆるTRPGテーブルトークRPG)の本を読むと、雰囲気が掴めるかもしれません。ファイティングファンタジーゲームブックを読むとシナリオも付いているので、それが良いかも。

 俺は「ぷよぷよ」で有名なコンパイル社出身の米光一成さんのおススメでこの「デバッグではじめるCプログラミング」も読みましたが、プログラム面では当時からこの本のレベルはとうに超えていて、しかしシナリオや映像制作に音響、音楽に世界観のまとまりなど、まだまだ「それってプログラミングの問題?」と思う所でたくさん詰まってます。ゲーム業界の黎明期には、コンピュータは新しいもので映像や音楽の専門家がコンピュータゲームに乗り出して、画素や音声は初歩的なコンピュータの表現力で幅は小さくとも、プログラムでは画像を点描するのではなくライブラリで表示するというようなレベルではなく本当にアセンブラでドット描画していた先輩方と比べて、仕事量も勉強量もまだまだだとは思ってます。高級言語使いとして、今の方が作業がラクチンなので、そのラクチンさを利用するために根本原理以外にSTLとかオブジェクト指向とかOSとか別の事を猛勉強してきたという人生とコンピュータ科学のねじれこじれがあるのです。

 46歳です。親戚の子供に今でも「大学落ちたんだってーw」と笑われています。


🄫1999-2023 id:karmen