「ゲームの初期化するタイミングを考える」の編集履歴(バックアップ)一覧はこちら
「ゲームの初期化するタイミングを考える」(2010/02/21 (日) 18:55:32) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*ゲームの初期化するタイミングを考える
ちょっと今まで作ったプログラムで試してもらいたいことがあります。
タイトル画面→ゲーム画面→ゲーム中に、(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;
}
*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(); // プレイヤーの初期化をする
}
}
*ゲームの初期化するタイミングを考える
ちょっと今まで作ったプログラムで試してもらいたいことがあります。
タイトル画面→ゲーム画面→ゲーム中に、(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)からはじめることができるようになりました。
表示オプション
横に並べて表示:
変化行の前後のみ表示: