はじめまして。VC++はじめたばかりの初心者です。
このような初歩的過ぎる質問するのも大変心苦しいのですが
どうぞご協力ください。
今SDIでゲームを製作しているのですが、プレイヤーの
生命力などの数値を全てCGameクラスで管理しようとしています。
そしてCGameViewクラスのonDraw関数内で、生命力を表示するために
CGame game;
pDC->TextOut(10,10,game.Life);
という記述にしました。ここでは割愛していますが、game.Lifeは
cha型に変換しております。
ここで問題なのが、生命力の初期値を20とするために、Initメソッド
(ゲーム開始時に一度だけ呼び出される)で
CGame game;
game.SetLife(20);
// 引数として与えられた整数を現在のLifeとする。
と記述しました。
このような記述でプログラムを実行したところ、まず実行時には
画面に「20」とライフが表示されましたが、一度ウィンドウを最小化してから
もう一度表示させると、「-858993460」という意味不明な数値に
置き換わっておりました。
自分なりに原因を考えてみたのですが、再描画されるたびにCGameクラスの
オブジェクトが生成されて、そのつどLifeの値が生成されたときの数値に
なってしまっているのではないかと考えました。
そこで質問なのですが、どのようにしたらゲームが終了するまで
Lifeなどの数値データの値を保存しておくことができるでしょうか?
CGameオブジェクトをローカル変数ではなくメンバ変数にすれば、良いのでは・・
ローカル変数の場合
{
CGame game;
game.SetLife(20);
} //←ここでgameオブジェクトは、破棄される・・(当然中身も・・)
メンバ変数の場合
class CGameView : ...
{
...
CGame m_game;
...
];
{
m_game.SetLife(20);
} //←ここでm_gameオブジェクトは、破棄されない・・(中身も保持・・)
... Lifeを CXXXDocument のメンバにする'だけ'のことではないかと。
# つか、その CGameこそがドキュメントなのでは?
>επιστημηさん
CXXXDocumentというクラスがよくわからないのですが、
そのクラスのメンバ変数に値を格納した場合、
それはずっと保存されるのでしょうか?
>不良PGさん
オブジェクトをローカル変数にではなくメンバ変数にする、ということは
ヘッダファイル内でCGgameオブジェクトを生成するということでしょうか?
ヘッダファイルで
CGame game;
と記述したらエラーがでてしまったので出来ないと思っているのですが・・。
>επιστημηさん
CGameDocクラスにLifeを定義し、Viewクラスで
CGameDoc doc;
とオブジェクトを生成しようとしたら「protectedメンバです」といった
エラーになってしまい、呼び出せませんでした。Documentとは
どういったもののことなのでしょうか?
> ヘッダファイルで
> CGame game;
> と記述したらエラーがでてしまったので出来ないと思っているのですが・・。
>
エラーとはどんなエラーですか?
CGameが定義されているヘッダファイルを、
メンバとして追加したヘッダファイル内でインクルードしてますか?
> CGameDocクラスにLifeを定義し、Viewクラスで
> CGameDoc doc;
> とオブジェクトを生成しようとしたら「protectedメンバです」といった
> エラーになってしまい、呼び出せませんでした。
class CGameDoc ... {
private:
int Life;
public:
void SetLife(int n) { Life = n; }
int GetLife() const { return Life; }
...
};
void CGameView::なにか() {
int life = GetDocument()->GetLife(); // よむ
GetDocument()->SetLife(20); // かく
}
> Documentとはどういったもののことなのでしょうか?
MFCのチュートリアル/マニュアルを読んでください。
>sugarさん
CGameのヘッダファイルをCGameViewのヘッダファイル内で
インクルードしましたところ、きちんとオブジェクトをメンバ変数として
定義することができました。動かしてみましたところきちんと値が
保存されておりました。ヘッダファイル内でもインクルードは
できるんですね。勉強不足でした。
>επιστημηさん
Docmentクラスはそのようにして呼び出すのですね。
クラスが多数になって様々な値を保存しなければならないようになったら
docmentクラスを使用してやってみたいと思います。
これでなんとかプログラムが動かせそうです。ご回答くださいました
不良PGさん、επιστημηさん、sugarさん、本当にありがとうございました!