第12章 ファイル操作

ゲームのハイスコアやランキング情報、マップデータやゲーム進行状況のセーブ・ロード機能など、データをファイルで保存しておきたい場面は少なくない。この章ではファイル操作をゲームに取り入れる様々な手法を紹介する。

この章を学ぶ前に、C言語入門講座のファイル操作を復習しておくこと。

前準備

12章用のプログラムを用意した。ダウンロードしてプロジェクトを作成し、正常に動くことを確認すること。
少し複雑なプログラムであるため、以下に概要を示す。

ゲーム概要

このゲームは、キャラクタを操作し、画面上を走り回る敵キャラをよけながらゴールを目指す。敵キャラに衝突すればゲームオーバーとなり、無事にゴールできるとステージクリアとなる。
すべてのステージをクリアすると、ゲームクリアとなる。
ステージは3面あり、上のステージに行くほど難易度が上がる(敵キャラが早くなるだけ)。
ゲーム中、ゲームを開始してからの経過時間が表示される。いかに短い時間でゴールまでたどり着くかを競うゲームである。

プログラム構成

このプログラムは、次のように作られている。

解説1:ゲーム開始時初期化処理について

ゲーム開始前初期化処理を、「ゲーム開始時初期化」「ステージ別初期化」の2つに分割した。これには、次の理由がある。

  1. ステージは3面あるが、ステージ別に背景画像をセットしなければならない。
  2. ゲーム開始時とは、スタート画面からゲームをスタートさせたときのことであり、TIMEは0から始まる。
  3. キャラクタの情報のうち、スタート時の表示座標や移動量は、ステージ毎にクリアしなければならない。

よって、ゲーム開始時とステージ切り替え時で、次のように各処理が実行されるようにプログラムした(WinMain.cpp内のUpdateFrame関数)。

ゲーム開始時(1面からスタート)
1.ゲーム開始時初期化処理(GameInit関数)
2.ステージ別初期化処理(GameStargeInit関数)
3.ゲーム処理(GameFrame関数)
ステージ切り替わり時(1面をクリアして2面、2面をクリアして3面へ行くとき)
1.ステージ別初期化処理(GameStargeInit関数)
2.ゲーム処理(GameFrame関数)

また、ゲーム開始時とステージ切り替わり時では、初期化するキャラクタ情報が違うため、キャラクタ初期化用関数も2つ用意している(StatusInit関数とStatusStargeInit関数)。
それぞれの関数が、キャラクタ情報のどの項目を初期化しているか、しっかりチェックしておこう。

解説2:ゲーム中の処理について

ゲーム中の処理は、次の順番で各処理を実行している。

それぞれの関数の中身をチェックし、何をしているのかを確認すること。

例)、
・ゴールまでたどり着いたかどうかの判定はどこにある?
・ゴールまでたどり着いたらどんな処理を行う?
・敵キャラに衝突したときの処理は?

解説3:ゲームオーバー・ゲームクリア処理について

ゲーム中、自キャラが敵キャラに衝突するとゲームオーバーとなり、それまでの経過時間が一定時間表示された後、スタート画面に戻る。
また、敵キャラにぶつかることなくゴールにたどり着いたら次のステージに行き、3面をクリアしたらゲームクリアとなる。クリア時も、経過時間を一定時間表示した後、スタート画面に戻る。

これだけであれば、ゲームオーバー処理とゲームクリア処理をわざわざ別の関数にする必要はないため、1つの関数にまとめてしまってもいいが、本来、ゲームオーバー時とゲームクリア時ではやりたいことがぜんぜん違う場合が多い。今後のことを考え、あえて別関数にした。

このサンプルプログラムがどのように作られ、どのように動作しているかをしっかり理解してから次へ進むこと。


[ TOP ]