皆様色々アドバイスありがとうございます。
色々ご指摘を読み解きながら自分のコードに反映させていきます。
個々にお返事が出来なく申し訳ありません。
色々思考したのですが、dicさんとせんちゃさんが仰っていただいた方法で管理したいとおもいます。
SRPGにおける大雑把な状態の変化はクラス分けによるステート処理を採用します。
(タイトル画面⇒セーブロード⇒幕間イベントシナリオ⇒ゲーム本体部分⇒幕間イベント→・・・・)
で、ゲーム本体部分は更に細かく分岐するのでdicさんのご提示頂いた1段階enum文のswitch処理で分岐させます。
ISLeさんにご指摘いただいた
>複数のオブジェクトを扱う処理に跨ったswitchは、switchを使うべきかどうかという以前に構造化を阻害する要因となります。
この文章を読んでドキッとしました。複数のオブジェクトを扱うスイッチ文だと多態性はどうやって持たせるんだろうかと悩んでいました。
ここは自分のクラス設計の問題なので、設計を見直すことで解消できそうです。
まず、SRPGの作り方も手探りでよくわかっていないので
支離滅裂のswitch文でSRPGの製作を進めてSRPGの作り方を深く学んだうえで再度リファクタリングをします。
その時に頂いたアドバイスが役に立ちます。壺の焼き色が気に食わなくて叩き割る陶芸家の気分です。
//流れだけ記述したテストコードです
//このままでは全く動かないのですが、雰囲気としてはこんな感じで検討しています。
► スポイラーを表示
コード:
typedef enum{
EnemyTurnInitilize,
EnemyThink,
EnemyMove,
EnemyMovedAfter,
EnemyMovedAction
}GameTransfer;
//ゲーム状態遷移
class Game : public BaseScene {
private:
GameTransfer gametransfer;//SRPGのゲーム本体部分を制御する状態遷移変数
enemy_force *lp_enemyforce;//敵軍の実態
public :
Game::Game(ISceneChanger* changer);
void Initialize() override; //初期化処理をオーバーライド。
void Finalize() override; //終了処理をオーバーライド。
void Update() override; //更新処理をオーバーライド。
void Draw() override; //描画処理をオーバーライド。
};
//キャラクタの抽象クラス
class charbase{
public:
GameTransfer think();
GameTransfer move() = 0;
GameTransfer MovedAfterThink() = 0;
GameTransfer MovedAction() = 0;
};
//敵クラス
class enemy:public charbase{
public:
GameTransfer think();
GameTransfer move() override;
GameTransfer MovedAfterThink() override;
GameTransfer MovedAction() override;
};
//敵管理クラス
class enemy_force{
public:
charbase *lpEnemy;//抽象クラスへの参照。ここに動かす敵のポインタを放り込む
GameTransfer TurnBeginInit();//ターン最初に抽象クラスへ動かす敵のポインタを放り込む
vector<enemy> lpEnemyData;//敵の個々の実態
};
//ゲーム本体部分更新処理
void Game::Update(){
swtich(gametransfer){
case EnemyTurnInitilize://敵情報の初期化
gametransfer = lp_enemyforce->TurnBeginInit();
break;
case EnemyThink://キャラクターオブジェクトに実装した動かす敵を割り出すメンバ関数を走らせる
gametransfer = lp_enemyforce->think();//終了したら次の遷移に移る
break;
case EnemyMove://キャラクターオブジェクトに実装した敵位置を動かすメンバ関数を走らせる
gametransfer = lp_enemyforce->lpEnemy->move();//敵を動かす
break;
case EnemyMovedAfter://移動後の思考
gametransfer = lp_enemyforce->lpEnemy->MovedAfterThink();
break;
case EnemyMovedAction://思考に基づき移動後の行動実行
gametransfer = lp_enemyforce->lpEnemy->MovedAction();
break;
//プレイヤーターンも同様に処理
}
}
//更新
void SceneMgr::Update(){
if(mNextScene != eScene_None){ //次のシーンがセットされていたら
mScene->Finalize();//現在のシーンの終了処理を実行
delete mScene;
switch(mNextScene){ //シーンによって処理を分岐
case eScene_Menu: //次の画面がメニューなら
mScene = (BaseScene*) new Menu(this); //メニュー画面のインスタンスを生成する
break;//以下略
case eScene_Game:
mScene = (BaseScene*) new Game(this);
break;
case eScene_Config:
mScene = (BaseScene*) new Config(this);
break;
}
mNextScene = eScene_None; //次のシーン情報をクリア
mScene->Initialize(); //シーンを初期化
}
mScene->Update(); //シーンの更新
}
概念的な事をお聞きしたかったので解決といたします。
後々いったん自分で噛み砕きコーディングしてから解らないときに再度質問させていただきます。
皆様ありがとうございました。