どうも、solaです。
今回はコンピュータゲームの仕組みについてのお話です。
■コンピュータゲームの定義
まずはさらっと、個人的コンピュータゲームの定義をしてみます。
1.コンピュータ上で動くこと
コンピュータゲームとは、パソコン・アーケード機・コンシューマ機といった各種コンピュータ上で実行するように設計・実装されたゲームソフト=プログラムを指します。
そして、ゲームソフトを設計・実装するのは人間であり、その作業をプログラミングと呼びます。(本来的にはプログラミングは実装(コーディング)を指します。ですが、ここでは個人制作をターゲットとしているので、設計もプログラミングに含めています)
例えば、RPGツクールや吉里吉里などを利用すれば、プログラミングをせずにゲームを作ることも可能だと思われますが、実はそれらも面倒な作業の大部分がカバーされているだけであって、プログラミング的な考え方=論理的思考はコンピュータゲームを作る上で必須です。
2.インタラクティブであること
インタラクティブとはユーザーの操作とソフト側の処理が対話形式で進んでいくもので、双方向性とか、対話性とも呼ばれます。もちろん、コンピュータゲームに限ったものではありません。
コンピュータゲームにおけるインタラクティブ性とは、ユーザの操作によってゲーム(ゲームの進行や結果)に変化が起こることを指します。
例えば、十字キーの右を押すとキャラクターが右に移動するとか、NPCの前でボタンを押したら会話がはじまるとか。それから、画面上を勝手に動き回る敵キャラクターも「ゲームをスタートした」というユーザの操作の結果起こった変化です。
ユーザが操作してもゲーム画面に変化が起こらない、または操作が一切介在ないものはゲームではなく、映像作品や音楽といった別の創作物だと言えます。※例外的に、スタート後は勝手にゲームが進んでいきユーザは何もせず画面を眺めているだけというモノもあることにはあります。
3.ゲーム性があること
十字キーの操作でキャラクターが上下左右に移動するだけではゲームとは呼べません。ゲームとは「遊び」でありエンターテインメントです。つまり、人の心を動かし、夢中にさせる仕組みが必要です。
キャラクターを操作して敵を避けるとか、戦闘を行って成長させより強い敵キャラクターを倒していくとか、謎をときながらストーリーを進めていくとか。そういったエンターテインメントを仕込んでいくことがゲーム作りであり、その作業をゲームデザインと呼びます(もっといろいろと含みますが)。そして、ゲームデザインによるゲームの分類が、アクション、RPG、シミュレーションといったジャンルを生み出します。
ゲーム制作において、このゲームデザインが最も重要な要素となります。
■ゲームプログラムの仕組み-fpsとは何か-
特に格闘ゲームやシューティングゲームが好きな方であれば、60fpsとか30fpsという言葉を聴いたことがあるのではないでしょうか。
fps(frame per second)とは、「一秒間あたりのフレーム数」を指します。60fpsなら一秒間に60フレーム、30fpsなら30フレームというわけです。
じゃあフレームってなんだよって話です。
例として「2DRPG風に十字キーの操作でプレイヤーキャラクターを動かす」ことを考えてみます。処理の概要は「十字キーの入力情報を取得」→「入力情報の方向に座標を動かす」→「その座標にプレイヤーキャラクターを表示する」という3つに別れ、その3つの処理をひとまとめにしたものをフレームと呼びます。設計によって千差万別ですが、1フレームの詳細は、例えば↓のような感じになります。
1フレーム
{
・ユーザによる十字キーの入力情報を取得する(入力がない場合は「入力情報がない」という情報になる)
・入力情報の方向に単位移動量分だけプレイヤーキャラクターの座標を動かす
・プレイヤーキャラクターの座標にプレイヤーキャラクターの画像を表示する。
}
ちなみに、単位移動量というのは、一回の入力で動く距離だと考えてください。2Dのようなドット単位の場合、1ドットだと滑らかに動きますが1フレームで1ドットしか動かないのでもっさりとします。16ドットだとスッキリと動きますが、16ドットごとにワープすることになります(人間の目にはちゃんと動いているように見えます)。
上記のフレームを何度も繰り返すことで、キャラクターが移動(もちろん操作がなければ止まります)するように見せるわけです。そして、このフレームを一秒間に60回ループさせれば60fps、30回なら30fpsになります。
ところで、上記程度の処理であれば数万fps以上とかで処理することが可能です(あくまで比喩です。多分もっと多いですし、環境によって変わります)。
でもそれでは困ります。なぜなら、fpsが増えるということはそれだけゲーム速度が早くなってしまうからです。早すぎて人間の目に止まらないというのはもちろんですが、例えばレースゲームのようなタイムを競うゲームにおいてユーザの環境ごとに操作感や速度が変わればタイムに影響します。そんなわけで「◯秒ごとにフレームを処理する」という風に制限をかけるわけです。それを固定fpsと呼び、60fpsであれば約0.017秒内で1フレームを処理します。
ゲームの機能が増えればそれだけフレーム内の処理も増えていきます。例えば「一歩動くたびに敵が出現するかどうか判定する」「現在立っているマップチップの情報を取得し毒の沼地ならHPを減らす」などです。本当は60fpsで動かしたかったのに、処理が多すぎるために1フレームを0.017秒で処理できなくなる場合には30fpsにfpsを落としたりします。最近のゲームに30fpsが多いのは高度な3D機能の処理の重さが原因でしょう。ちなみにファミコンなどで敵キャラがたくさん出てきた時に画面がちらついたり重くなったりするのもこれが原因です。処理が増えることで、フレームを実行する時間が増えてしまうのです。
ゲームプログラミングの手法(パラダイム)や2D/3Dの差こそあれ、ゲームプログラミングの基本は上記のようなもので変わりません(※あくまで概念レベルでは)。
簡単にまとめると、コンピュータゲームとは「フレーム内の処理を繰り返し実行し続ける」ものであり、ゲームプログラミングとはそのループする各処理を実装していくことになります。この概念はかなり重要で、この辺りの理解不足でつまずく人をそれなりに見ています。
老婆心ながら補足ですが、操作を一切しない場合でもフレームの繰り返し(ループ)は常になされています。原則としてゲームプログラムを終了するまで止まることはありません。
あくまで概念的な話なので正確でない部分もありますが、とにかくわかりやすさ優先で書いてみました。ひとつのループ(メインループとかゲームループとか呼びます)に実直にすべての処理をコーディングしていく設計思想は現在では古いものだということにご注意ください。
実際のハード(CPUやメモリ、入出力装置など)やソフト(プログラミングの文法、オブジェクト指向など)的な面からのゲーム制作についてはまた別の機会ということで。
それでは。
< はじめに : ものぐさ文系脳のためのプログラミング勉強法>