ゲームの初期化するタイミングを考える
ちょっと今まで作ったプログラムで試してもらいたいことがあります。
タイトル画面→ゲーム画面→ゲーム中に、(0,0)以外のマスに移動→キー入力してクリア画面またはリタイア画面に移動→タイトル画面に戻る→再びゲームスタート
タイトル画面→ゲーム画面→ゲーム中に、(0,0)以外のマスに移動→キー入力してクリア画面またはリタイア画面に移動→タイトル画面に戻る→再びゲームスタート
プレイヤーの開始位置はどうなりましたか?(0,0)ではなく、前回最後にいたマスからスタートになっているはずです。どこでも値を書き換えてないから当然ですね。これでは将来的に使い物にならないので改善しましょう。最終的なプレイヤーの開始位置はステージ情報によって異なりますが、今回は何回スタートしても(0,0)からはじめることが出来るようにしましょう。タイトル画面からゲーム画面に移るときに初期化します(あとでさらに呼び出す場所を変更します)。
- main.hにInitPlayer関数のプロトタイプ宣言を追加
- game.hにInitPlayer関数の定義を記述
- title.cppにゲームに移るときにInitPlayer関数を呼び出すように記述
main.h
... #include"struct.h" // 構造体定義のヘッダーを読み込む extern SPlayer Player; // プレイヤー構造体 void MovePlayer(); // プレイヤーを移動する void InitPlayer(); // プレイヤーを初期化する
game.cpp
... // プレイヤーを初期化する // 戻り値なし 引数なし void InitPlayer(){ Player.x = 0; Player.y = 0; printfDx("InitPlayerが呼び出されました\"); }
title.cpp
// タイトルの関数 // 戻り値 なし 引数 なし void Title(){ DrawGraph(0,0,TitleGraphic,FALSE); // 画像を表示 DrawString(100,100,"タイトル画面です",white); DrawString(100,120,"Zでゲームをはじめる",white); if( Key[KEY_INPUT_Z] == 1 ){ // Zキーが押されたらゲームを始める GameState = 1; InitPlayer(); // プレイヤーの初期化をする } }
game.cppでまたデバッグのためにprintfDx関数を呼び出しています。新しい関数を追加したときはしっかり呼び出されているかを確認するために必ずこのように書きましょう。関数の定義を書いたのはいいけど、呼び出すことを忘れてしまうといったことは多々あります。今回のようにある条件を満たしたときに呼び出される関数の場合、条件がありえないもの(絶対呼び出されない)などのバグを見つけることも出来ます。確認できたら消しましょう。
これで何回ゲームをリスタートしても(0,0)からはじめることができるようになりました。