ページ 11

ステージ作成について[継承やらvectorやら]

Posted: 2013年3月19日(火) 20:43
by クールアイス
こんばんは。
今日は「継承」や「vector」といったものについての質問です。

現在ステージ1~5程度まである簡単なミニゲームを作ろうとしています。
今まではステージを作るなら

コード:

ステージ1{
    更新()
};
ステージ2{
    更新()
};


メインループ
{
    switch(シーン)
    {
        case Stage:
        switch(stage_number)
        {
            case 1:
            ステージ1.更新()
            case 2:
            ステージ2.更新()
        }
    }
}
とやっていました。
しかし、せっかくc++を使っているのに、「継承」やら「vector(コンテナ?)」やらを使わないのはもったいないし、何より勉強にならないのではないかと勝手に思っています。

そこで、「基底クラスを作り継承」「沢山あるステージクラスをvectorで管理」しようと考えました。
以下が調べながら考えたものです。

BaseStage.h

コード:

class BaseStage
{
public:
	BaseStage() {}            // コンストラクタ
	virtual ~BaseStage() {}   // デストラクタ
	virtual void Run() = 0;   // 全更新

protected:
	virtual void Update() = 0;// 更新
	virtual void Draw() = 0;  // 描画
};
Stage.h

コード:

class Stage1 : public BaseStage
{
public:
	Stage1() {}
	~Stage1() {}
	virtual void Run();

private:
	virtual void Update();
	virtual void Draw();
};
Stage.cpp

コード:

void Stage1::Update()
{}

void Stage1::Draw()
{}

void Stage1::Run()
{
	Update();// 更新
	Draw();  // 描画
}
Main.h

コード:

std::vector<BaseStage*> stages;
int stage_numger;
現在はここまでしかありませんが、[stages]に[push_back]でステージを追加し(new Stage1()とやる?)、[stage_numger]で管理すれば、

コード:

メインループ
{
    switch(シーン)
    {
        case Stage:
            stages[stage_number].Run();
            break;
    }
}
となって、ステージが増えてもとても管理しやすいんじゃないか!?・・・という結論に至りました。

長々と書いてしまいましたが、継承やvectorの使い方、認識はこれで合っているでしょうか?

Re: ステージ作成について[継承やらvectorやら]

Posted: 2013年3月19日(火) 20:50
by softya(ソフト屋)
根本的な問題としてはステージごとにクラスが必要かという汎用化の問題が有るんですが、これは一旦置いておきます。

まず、ステージクラスのインスタンスがvectorで管理する必要があるのか?が疑問ですね。stage1の時にstage2のインスタンスが生成されている必要の有る理由を思いつきません。
あとコンパイル確認してないと思いますが、 stages[stage_number]->Run(); じゃないでしょうか。

Re: ステージ作成について[継承やらvectorやら]

Posted: 2013年3月19日(火) 21:40
by クールアイス
<<softyaさんありがとうございます。

<<根本的な問題としてはステージごとにクラスが必要かという汎用化の問題が有るんですが、これは一旦置いておきます。
そもそもそれぞれをクラス化する必要がないという点は頭になかったですね・・・。

<<まず、ステージクラスのインスタンスがvectorで管理する必要があるのか?が疑問ですね。stage1の時にstage2のインスタンスが生成されている必要の有る理由を思いつきません。
これはつまり、[stages]を作った段階で[Stage1クラス]も[Stage2クラス]、もっとあればそれらのインスタンスも作られてしまう、ということでしょうか。
[stages->push_back(new Stage2()]のようにするまで存在しないものと勘違いしていました。

<<あとコンパイル確認してないと思いますが、 stages[stage_number]->Run(); じゃないでしょうか。
確認していませんでしたが、この場合はポインタを使っているので[.]ではなく[->]を使用するべきでしたか。

Re: ステージ作成について[継承やらvectorやら]

Posted: 2013年3月19日(火) 21:44
by softya(ソフト屋)
クールアイス さんが書きました:<
これはつまり、[stages]を作った段階で[Stage1クラス]も[Stage2クラス]、もっとあればそれらのインスタンスも作られてしまう、ということでしょうか。
[stages->push_back(new Stage2()]のようにするまで存在しないものと勘違いしていました。
これは書かれていなかったので、こちらの勘違いです。
そうすると随時インスタンスを生成すると言うことでしょうか?
その場合はstage1のインスタンスは破棄されるのですか?
だとvector自体が不要になると思うのですが。

Re: ステージ作成について[継承やらvectorやら]

Posted: 2013年3月19日(火) 21:58
by クールアイス
<<これは書かれていなかったので、こちらの勘違いです。
そうすると随時インスタンスを生成すると言うことでしょうか?
その場合はstage1のインスタンスは破棄されるのですか?
だとvector自体が不要になると思うのですが。

確かに、随時インスタンスを生成しようとしていました。また、ステージが終わったら破棄しようと思っていたので、冷静に考えてみればvector全く必要ないですね・・・。
これでは今までのやり方と手間もあんまり変わらないですもんね。

適材適所をよく考えてみます。ありがとうございました。