ゲームのハイスコアやランキング情報、マップデータやゲーム進行状況のセーブ・ロード機能など、データをファイルで保存しておきたい場面は少なくない。この章ではファイル操作をゲームに取り入れる様々な手法を紹介する。
この章を学ぶ前に、C言語入門講座のファイル操作を復習しておくこと。
12章用のプログラムを用意した。ダウンロードしてプロジェクトを作成し、正常に動くことを確認すること。
少し複雑なプログラムであるため、以下に概要を示す。
このゲームは、キャラクタを操作し、画面上を走り回る敵キャラをよけながらゴールを目指す。敵キャラに衝突すればゲームオーバーとなり、無事にゴールできるとステージクリアとなる。
すべてのステージをクリアすると、ゲームクリアとなる。
ステージは3面あり、上のステージに行くほど難易度が上がる(敵キャラが早くなるだけ)。
ゲーム中、ゲームを開始してからの経過時間が表示される。いかに短い時間でゴールまでたどり着くかを競うゲームである。
このプログラムは、次のように作られている。
![]()
ゲーム開始前初期化処理を、「ゲーム開始時初期化」「ステージ別初期化」の2つに分割した。これには、次の理由がある。
- ステージは3面あるが、ステージ別に背景画像をセットしなければならない。
- ゲーム開始時とは、スタート画面からゲームをスタートさせたときのことであり、TIMEは0から始まる。
- キャラクタの情報のうち、スタート時の表示座標や移動量は、ステージ毎にクリアしなければならない。
よって、ゲーム開始時とステージ切り替え時で、次のように各処理が実行されるようにプログラムした(WinMain.cpp内のUpdateFrame関数)。
- ゲーム開始時(1面からスタート)
- 1.ゲーム開始時初期化処理(GameInit関数)
- 2.ステージ別初期化処理(GameStargeInit関数)
- 3.ゲーム処理(GameFrame関数)
- ステージ切り替わり時(1面をクリアして2面、2面をクリアして3面へ行くとき)
- 1.ステージ別初期化処理(GameStargeInit関数)
- 2.ゲーム処理(GameFrame関数)
また、ゲーム開始時とステージ切り替わり時では、初期化するキャラクタ情報が違うため、キャラクタ初期化用関数も2つ用意している(StatusInit関数とStatusStargeInit関数)。
それぞれの関数が、キャラクタ情報のどの項目を初期化しているか、しっかりチェックしておこう。
ゲーム中の処理は、次の順番で各処理を実行している。
![]()
それぞれの関数の中身をチェックし、何をしているのかを確認すること。
- 例)、
- ・ゴールまでたどり着いたかどうかの判定はどこにある?
- ・ゴールまでたどり着いたらどんな処理を行う?
- ・敵キャラに衝突したときの処理は?
ゲーム中、自キャラが敵キャラに衝突するとゲームオーバーとなり、それまでの経過時間が一定時間表示された後、スタート画面に戻る。
また、敵キャラにぶつかることなくゴールにたどり着いたら次のステージに行き、3面をクリアしたらゲームクリアとなる。クリア時も、経過時間を一定時間表示した後、スタート画面に戻る。これだけであれば、ゲームオーバー処理とゲームクリア処理をわざわざ別の関数にする必要はないため、1つの関数にまとめてしまってもいいが、本来、ゲームオーバー時とゲームクリア時ではやりたいことがぜんぜん違う場合が多い。今後のことを考え、あえて別関数にした。
このサンプルプログラムがどのように作られ、どのように動作しているかをしっかり理解してから次へ進むこと。