ゲームプログラミングを学ぶに当たり、まず、既存のゲームがどうやって動いているのかが気になっている方もいらっしゃるのではないでしょうか?
ここでは「プログラムがコンピュータのメモリをこうやって使ってグラフィックを表示する」といったような細かい話はひとまず後回しにして、ゲームがゲームを進行させる仕組みの大まかなイメージをお伝えします。
パソコンで動くゲームにしろ、コンシューマゲーム機で動くゲームにしろイメージは同じですので、ここで基本をつかんでいきましょう。
ゲームではたくさんのキャラクターが画面内を自由自在に動き回ったり、プレイヤーの動きに合わせて背景がスクロールしたりしていますよね?これはいったいどうやって動かしているのでしょうか?
唐突ですが、みなさまはパラパラ漫画をご存じでしょうか?学校で使うノートや辞書の端っこなどに少しずつ内容が変わる絵を描いて、パラパラと連続でめくることで絵が動いて見えるようにする遊びですが、実はゲームの画面もこれと同じ要領でキャラクターや背景を動かしているのです。
ゲームの画面というのはなめらかに動いているように見えて1秒間に 60 回もの頻度で高速に書き換えられています。パラパラ漫画と同じ要領で、前に描いた内容とは少しずつ違う画面を描くことによって、各キャラクターや背景が動いているように見せています。

この1秒間に画面を書き換える頻度のことをフレームレートと呼びます。その中の1コマのことを1フレームと呼びます。
ちなみに、このフレームレートは、コンシューマゲーム機の場合は 30 フレームの場合があったり、パソコンの 3D ゲームの場合は 80 フレームを超える場合もあったりと、設計や環境によって異なります。
普段 Windows を使っていると、とても1秒間に 60 回も画面を書き換えて無事で済みそうな気がしませんよね?(私だけでしょうか)
しかし、実際には問題ありません。 Windows の動作が重たいのは様々な処理に CPU パワーとハードウェアの資源を持って行かれているからです。
本来、パソコンは非常に高速な描画性能を誇ります。
たとえば Windows 95 時代の CPU は、今とは比べものにならないほど貧弱な性能でしたが、それでも1秒間に 60 回もの画面の書き換えを実現することができていました(実際に当時の MS-DOS でゲーム作りを学んでいましたので)。
今、目の前にあるパソコンは思っている以上に高性能なのです。
ゲームの画面はパラパラ漫画であることがわかりました。
もし、スーパーマリオのような横スクロールアクションゲームで、1秒間に 60cm 移動するキャラクターがいたとすると、そのキャラクターは1フレームの間に 1cm だけ移動しています。 1cm ずつ 60 回に分けて移動することで、結果的に1秒間に 60cm 移動することになります。どうして 60 回に分けて少しずつ移動させるのかというと、動きをパラパラ漫画のようになめらかに見せるためです。
キャラクターが何人かいるのであれば、その人数分だけ同じことをするだけです。
スーパーマリオの 1-1 の冒頭を例にとってみます。
□ マリオを十時キーが押されている方向へ1フレーム分動かす。
↓
□ クリボーを進行方向へ1フレーム分動かす。
↓
■ マリオとクリボーを画面に描く(1フレーム目の画面)
↓
□ マリオを十時キーが押されている方向へ、先ほどの位置よりもう1フレーム分動かす。
↓
□ クリボーを進行方向へ、先ほどの位置よりもう1フレーム分動かす。
↓
■ マリオとクリボーを画面に描く(2フレーム目の画面)
↓
□ マリオを十時キーが押されている方向へ、先ほどの位置よりもう1フレーム分動かす。
↓
□ クリボーを進行方向へ、先ほどの位置よりもう1フレーム分動かす。
↓
■ マリオとクリボーを画面に描く(3フレーム目の画面)
↓
(これの繰り返し)
ここで、□はプレイヤーからは見えないコンピュータ内部の処理を意味します。一方の■はプレイヤーの目に見える画面の変化を意味しています。
さて、いったいこの手法のどこが重要なのでしょうか?
実は、こうやって動かしたキャラクターは、実際にゲームを遊んでみると同時に動いているように見えるのです。
「パラパラ漫画の要領なんだから当然でしょ?」と気づかれた方は読み飛ばしていただいて問題ありません。
もし、普段ゲームを遊んでいて、プレイヤーのキャラクターや敵キャラクターが同時に動いていることになんら疑問を感じていなかった方は覚えておいてください。ゲームの内部ではキャラクターをひとりずつ動かしているのです。
一見「キャラクターをひとりずつ動かす」と聞くと「ゲームの動きが不自然になってしまうのではないか?」と疑問に感じてしまいますよね?
しかし実際は、□のように裏でキャラクターをひとりずつ動かしていたとしても、プレイヤーから見えるのは■の画面だけなのですから、結果的にパラパラ漫画を見ているのと同じことになり、キャラクターは同時に動いているように見えるというわけです。
たとえば、スーパーマリオの主人公であるマリオは、十時キーの左右どちらかの押された方向へ移動しますが。どのタイミングで「あ、右が押されたな?じゃあ、右へ動こうか」と判断していると思いますか?
答えは毎回です。
毎回とは毎フレーム、つまり 1/60 秒ごとです(1秒間に 60 回のパラパラ漫画なのですから1フレームの時間は 1/60 秒になります)。
このようにゲームのキャラクターは1フレームごとに「次にどう動くか?」を決定しています。
敵キャラクターがコントローラで動くことはほとんどないと思いますが、たとえばクリボーが「次にどう動くか?」という動きも1フレームごとに決定しています。クリボーは次ようなルールで動いていると推測できます。
たとえばグラディウスの最初に出てくる敵は移動コースが決まっていますが、これも1フレームごとに「次にどう動くか?」を決定しています。
作り方はいろいろあるのですが、たとえば次の表のように、各フレームごとに移動方向を決めておくことでも実現することができます。
| フレーム | 動き |
|---|---|
| 1 | まっすぐ移動 |
| 2 | まっすぐ移動 |
| 3 | まっすぐ移動 |
| 4 | 右下へ移動 |
| 5 | 右下へ移動 |
| … | … |
ここで重要なのは、自分が画面に出現してから何フレームが経過したかを数えておくことです。最初のフレームでは「今、出現して1フレーム目だから”まっすぐ移動”だ」4フレーム目では「今、出現してから4フレーム目だから”右下へ移動”だ」というように、毎回決定することができます。