数値データを扱いたい – プログラミング – Home

通知
すべてクリア

[解決済] 数値データを扱いたい


MSRX
 MSRX
(@MSRX)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

はじめまして。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などの数値データの値を保存しておくことができるでしょうか?


引用未解決
トピックタグ
不良PG
 不良PG
(@不良PG)
ゲスト
結合: 23年前
投稿: 188
 

CGameオブジェクトをローカル変数ではなくメンバ変数にすれば、良いのでは・・

ローカル変数の場合

{
CGame game;
game.SetLife(20);
} //←ここでgameオブジェクトは、破棄される・・(当然中身も・・)

メンバ変数の場合

class CGameView : ...
{
...

CGame m_game;

...
];

{
m_game.SetLife(20);
} //←ここでm_gameオブジェクトは、破棄されない・・(中身も保持・・)


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

... Lifeを CXXXDocument のメンバにする'だけ'のことではないかと。
# つか、その CGameこそがドキュメントなのでは?


返信引用
MSRX
 MSRX
(@MSRX)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

>επιστημηさん
CXXXDocumentというクラスがよくわからないのですが、
そのクラスのメンバ変数に値を格納した場合、
それはずっと保存されるのでしょうか?


返信引用
MSRX
 MSRX
(@MSRX)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

>不良PGさん
オブジェクトをローカル変数にではなくメンバ変数にする、ということは
ヘッダファイル内でCGgameオブジェクトを生成するということでしょうか?
ヘッダファイルで
CGame game;
と記述したらエラーがでてしまったので出来ないと思っているのですが・・。

>επιστημηさん
CGameDocクラスにLifeを定義し、Viewクラスで
CGameDoc doc;
とオブジェクトを生成しようとしたら「protectedメンバです」といった
エラーになってしまい、呼び出せませんでした。Documentとは
どういったもののことなのでしょうか?


返信引用
sugar
 sugar
(@sugar)
ゲスト
結合: 24年前
投稿: 448
 

> ヘッダファイルで
> CGame game;
> と記述したらエラーがでてしまったので出来ないと思っているのですが・・。
>
エラーとはどんなエラーですか?
CGameが定義されているヘッダファイルを、
メンバとして追加したヘッダファイル内でインクルードしてますか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 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のチュートリアル/マニュアルを読んでください。


返信引用
MSRX
 MSRX
(@MSRX)
ゲスト
結合: 22年前
投稿: 4
Topic starter  

>sugarさん
CGameのヘッダファイルをCGameViewのヘッダファイル内で
インクルードしましたところ、きちんとオブジェクトをメンバ変数として
定義することができました。動かしてみましたところきちんと値が
保存されておりました。ヘッダファイル内でもインクルードは
できるんですね。勉強不足でした。

>επιστημηさん
Docmentクラスはそのようにして呼び出すのですね。
クラスが多数になって様々な値を保存しなければならないようになったら
docmentクラスを使用してやってみたいと思います。

これでなんとかプログラムが動かせそうです。ご回答くださいました
不良PGさん、επιστημηさん、sugarさん、本当にありがとうございました!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました