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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クールアイス
記事: 34
登録日時: 12年前

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

#1

投稿記事 by クールアイス » 12年前

こんばんは。
今日は「継承」や「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の使い方、認識はこれで合っているでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#2

投稿記事 by softya(ソフト屋) » 12年前

根本的な問題としてはステージごとにクラスが必要かという汎用化の問題が有るんですが、これは一旦置いておきます。

まず、ステージクラスのインスタンスがvectorで管理する必要があるのか?が疑問ですね。stage1の時にstage2のインスタンスが生成されている必要の有る理由を思いつきません。
あとコンパイル確認してないと思いますが、 stages[stage_number]->Run(); じゃないでしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

クールアイス
記事: 34
登録日時: 12年前

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

#3

投稿記事 by クールアイス » 12年前

<<softyaさんありがとうございます。

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

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 12年前

クールアイス さんが書きました:<
これはつまり、[stages]を作った段階で[Stage1クラス]も[Stage2クラス]、もっとあればそれらのインスタンスも作られてしまう、ということでしょうか。
[stages->push_back(new Stage2()]のようにするまで存在しないものと勘違いしていました。
これは書かれていなかったので、こちらの勘違いです。
そうすると随時インスタンスを生成すると言うことでしょうか?
その場合はstage1のインスタンスは破棄されるのですか?
だとvector自体が不要になると思うのですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

クールアイス
記事: 34
登録日時: 12年前

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

#5

投稿記事 by クールアイス » 12年前

<<これは書かれていなかったので、こちらの勘違いです。
そうすると随時インスタンスを生成すると言うことでしょうか?
その場合はstage1のインスタンスは破棄されるのですか?
だとvector自体が不要になると思うのですが。

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る