ゲームってどうやって作るんですか?
< 簡単? 難しい? それよりどうして良いか分からない >


 私は授業でファミコンの話をするヘンな先生でした。プログラミングでゲームが作れることは楽しいので広められたら…、ゲーム製作について気楽に話せたら…、と思って用意したページでした。しかし中身を書かないうちに時代が流れてしまったので、当初考えていたよりもっといい加減に書いてみようと思います。
 また、ここでは大したことは書きませんが、それでもWindows上でゲーム機でプレイするような…要するに全画面で音も賑やかに…とつながる方面の製作を想定しています。どなたかに、何かのきっかけになればと思い、一応載せてみました。

 0.はじめに 気持ちの整理?
 このコーナーではプログラミングにてゲームを作ることを考えていますが、時代は流れ、ゲーム製作ツールもたくさん出てきました。プログラミングで作ることの最大の長所は、100%自分の思い通りに作り得ることだと思います。しかし大変です。製作ツールを利用するとプログラミングに比べるとかなり簡単にゲームが作れると言えますが、仕様などにより表現できないことがあればそれ以上のことはできないという心配がつきまといます。どちらにしてもゲーム一本作るとなれば大変な時間を要すので、この選択は結構大きい問題かもしれません。でも、これについてはこれ以上触れません。
 また、プログラミングと直接関係なくても、画像・音声(・BGM)は必要でしょう。何らかの方法でそれらも別途用意することになります。これらもここでは触れませんが、それらを自分で用意することも事前に考えておきましょう。
 上記のとおり、きっかけ程度の話です。いきなり派手な3Dとか壮大なストーリーとかを考えるのではなく、キャラクター一つ動かすには?といった程度のことから始めようとする時に向けたお話です。

 1.必要な基礎知識 気楽でも基礎は必要
 どの言語を選んでも、基礎知識は必要です。一方で、分厚い参考書の全てが必要になるわけではありません。高度な手法などは使用しなくても、自分が思ったとおりにプログラムの流れを組めれば良いのです。
 数の扱いや計算、ifなどの分岐、switchやselectなどの多分岐、forなどの指定回数繰り返し、doやwhileなどの無限ループ、…ちょっと極端ですが、これくらいあればプログラムの流れは自由に組めるはずですよね。ま、入出力も必要ですが、ちょっとここではおいておきます。
 VBやVCなどで学習を始める場合、オブジェクト〜プロパティ〜とありますが、使用するつもりがなければ少しやったら飛ばしましょう。

 2.プログラムの全体から 授業で習うプログラムとは異なる、のかなぁ?
 学習初期には、三角形の面積を求めて出力する、などといった小さいネタを習うでしょう。だんだん大きい問題になって長くなりますが、だいたい「開始」と「終了」があったりしますね。しかしゲームって、ずっと動いていますよね。同時にいくつもの物事が動いていますよね。そこで、プログラム全体を回しっぱなしにして、ほぼ全ての物事を毎回処理し、回ってくる毎に都合よく動いてくれるように考えなければなりません。突然な話になりましたが、入力・計算・判断・出力、は人間から見たら忙しい速さでどんどん何度も行われているから、複数の物が同時に動いているのを感じられます。「開始と終了」から「回りっぱなしのプログラム」へ。慣れるのは大変ですがその考え方を鍛えていきましょう。回りっぱなしの中で、その時必要となる物事をどんどん分岐命令で分けていくのです。制御プログラムなど、実用的なものはみなそうですね。

 3.変数及び数 数は何を表す?
 変数…数の入れ物であり、計算によって値を変えることができますね。点数やキャラクターの能力値など、数で表せることに使うのはすぐ想像できるでしょう。しかし、数として表示されないものやそもそも数とは思えない物事の記憶・判断にも使っていきます。RPGでは実は古くから「歩数」が計測されており、表示されなくてもエンカウントなどと関わったりしていました。画面上を動き回るキャラクター、その「位置」を表すのも数です。2Dなら縦横ありますから、すぐに2つの変数が必要になります。あるイベントをこなしたかどうかを記憶しておくのも変数です。今、何をしているかを表すのも変数の役割です。例えば、今はタイトル画面?ゲーム中?エンディング? そんなところも数で表現し、記憶し、分岐に使うのです。他にどんなものがあるでしょうか? キャラクターの「性別」を0か1かで表すなど、どんどん膨らんできますね。どのアイテムを所持しているか(所持「していない」を含む)とか、キャラクタの種類とか状態とか、アニメーションの進行具合とか、カーソルの位置とか、操作情報とかもですね。
 そう、どの変数にどの値が入っているかでルールや仕様の全てを表すのです。
 キャラクターを一人考えるだけでも、記憶したいものはたくさんあるはずです。配列も扱えた方が良いのは想像に難しくないですね。たくさん必要だと分かりますね。すぐに数十〜数百のデータを自分で整理・把握することになりますが、頑張ってみましょう。

 4.ループ ループがあるから動きがある、のは分かるけど?
 上で、ゲームのプログラムは「回りっぱなし」だと書きました。その理由の代表が、キャラクターの動き「アニメーション」です。一見全キャラクターが停止しているようなシーンでも、プログラムは毎回画面の全消去・表示すべき全キャラクターの描画を行っています。キャラクターの位置を示す変数の内容が毎回変わり、その位置へ表示することを繰り返せば、動きに見えるのです。
 そんな無限ループには結構大事なことがあります。ループの開始・終了の書き方はもちろんですが、Windowsの場合DoEvents(VB風)などの他の処理を許可する一言、ループ速度が一定になるための処理「ウェイト」が必要になってきます。
 このウェイトがまた大切で、必ず施すことになります。そしてゲーム向けにはいよいよハードウェアとの兼ね合いも出てきます。プログラムの実行速度は環境やゲームの場面毎にいろんな状態になるので、ゲーム側のプログラムだけで処理速度一定とするのはほぼできません。そこで、ビデオデバイスからの垂直同期信号に頼ります。また急な話ですが、そんなハードウェアの機能を利用するのがDirectXということになります。利用(プレイ)する側の立場では聞いたことある方も多いでしょう。今度はそれを製作側で利用します。実際の打ち込み(設定・スペル・文法等)に当たっては、言語毎の参考書をご覧ください。
 今は、処理速度一定のためにDirectXといった感じで話しましたが、画面表示・音声再生・BGM再生・入力操作・等々といった、ゲーム向けの入出力のほとんどは、このDirectXでより良く可能となります。これらも具体的には山ほどの話になりますが、最低限であれば参考書から抜き出して使うこともそれほど難しくないでしょう。
 なお、話が戻るようですがアニメーション「だけ」を学習するとき、forを使ってある場所からある場所へ動かす〜などとすることがありますが、ゲームには向きません。forは指定回数繰り返しに向くので、似た情報を一気に処理するのに使用します。シューティングなどでは同じ敵キャラがたくさんいたりしますね。これらを一気に処理するのに使います。ま、実際には「同じ物」だけをforでまとめるのではなく、ほぼ全キャラをまとめるようになると思いますけどね。

 5.ルールをプログラミングする 人間の都合とコンピュータの都合
 すんごい大雑把なこの記事ですが、これらを並べただけでも動きというものがいくらか想像できるようになってきていると思います。ルールの多くを変数で表すことは前にも書きましたが、ここでは人間(作者)の要求をプログラミングする一例を書いてみます。
 ごく小規模な2Dシューティングゲームを製作中のある一こま、「スペースキーを押したら弾を発射する」を作ろうとしています。さぁ、これはどう考え、表せば良いのでしょうか。この一言の人間側の要求に、実は結構たくさんのことが詰まっています。条件が一言なので、ifも一つでしょうか? 「発射」とはプログラム的にはそもそも何でしょう?
 話が逸れるようですが、まず「弾」は同時に(画面中に)何個まで存在可能としますか? 「弾」に関する変数は、縦位置・横位置・そして「状態」を用意します。(この考えは絶対ではなく他の考え方もできます。しかし情報毎に変数を用意した方が楽でしょう。)「状態」とは、「弾」自身が存在しているか否かを表します。上記の存在可能数と併せて、配列を用意しておくことになります。
 オート連射についてはどう考えますか? これまで述べたようにプログラムはどんどん回っていますから、ただ「キーを押したら発射」と考えると、キーを一瞬押しただけで何発も「発射」されてしまいます。ま、適度な連射速度となるよう、プログラムのこの部分が数回回ったうちの1回「発射」されるようにするのが良いでしょうか。そうすると、それを数えるカウンタとなる変数もまた必要になりますね。
 ではいよいよ「発射」を考えます。もちろん、キーを押していたかifで分岐させ、オート連射と併せて本当に「発射」して良いかまたifで判断します。次にforで弾の配列を見て、「状態」が「存在していない」となっている変数を探します。見付かったらその配列の縦位置・横位置を「自機」の位置と併せて計算し、「存在している」にします。オート連射のためのカウンタの処理をしておきます。これらが済んだらforは用済みなので、途中で抜け出します。(exit for)
 またいきなりで、何だこりゃ?と感じるかもしれません。でもじっくりやってみてください。これらのことが必要であることが分かるはずです。更に、もう少し加えないと実用的でないことも分かるはずでし、ここでは「発射」のみを述べており、その後の動きや描画はまた別となります。

 6.これでおしまい その一つできたことが大切
 いかがでしたでしょうか。プレイ中のほんの一瞬のことも、作る立場では最低でもこれくらい考えることになります。たった一つのルール・物事で。あなたの考えるゲームの大小細かいルールを全て表すのは決して簡単な事ではないでしょうが、プログラミングによるゲーム製作を選んだ方はこの翻訳のような作業を山ほど行うことになります。思い浮かべたゲームの完成へ向けて、是非挑戦を続けてください。
 もちろん最低限必要な話としてもまだ不足だらけです。上で「回りっぱなしのプログラム」と書きましたが、それはそれで終了処理が必要になります。サブルーチンなどの話も当然あった方が良いはずです。
 短く済ますつもりが、ひたすら文章となってしまいました。とても読みにくかったと思いますが、最後までお読みいただきありがとうございました。こんなのでも、気が向いたら加筆するかもしれません。ではでは。

戻る