
#ifndef __CSCENEMANAGER_H__
#define __CSCENEMANAGER_H__

#include "..\CommonIncludes.h"

//==============================================================
//! @class CSceneManager
//! @brief シーン管理クラス
//!     
//!     シーン管理クラスが個々のシーンクラスを操作する。
//!     
//==============================================================
class CSceneManager {
public:

	//==============================================================
	//! @enum  ESceneType
	//! @brief ゲームシーンの各種定数
	//==============================================================
	enum ESceneType {
		TITLE,       //!< タイトル
		CONQUEST,    //!< 戦闘シーン
		TERMINAL,    //!< 結果画面

		TOTAL,
	};
	
	//==============================================================
	//! @attention
	//! プログラムの実行中に、一度しかインスタンスを
	//! 生成できないようになっています。コピーも出来ません。
	//! 
	//! extern付きグローバル変数のように振る舞う、
	//! デザインパターン【Singleton】と異なり、二度生成しようとすると落ちます。
	//! deleteした後に、newしても落ちるため、スコープを抜けるときに
	//! ポインタを保持していないと二度と使えませんのでご注意ください。
	//! 
	//==============================================================
	CSceneManager( void );
	
	//==============================================================
	//! @brief 現在のシーンを実行します。
	//! 
	//! @par arg_inImageManager 画像への操作はこのインスタンスを使用します。
	//! @par arg_inAllKeysState キー情報取得用のクラスです。
	//! 
	//==============================================================
	void Run( CImageManager* arg_pinImageManager, CAllKeysState* arg_pinAllKeysState );
	
private:
	//! @brief 現在のシーンのID
	ESceneType m_eCurrentSceneType;
	
	//! @brief 実行中のシーンのインスタンス
	CSceneBase* m_pinCurrentScene;
	
	//==============================================================
	//! @brief シーンをセットします。
	//! 
	//! シーンクラスから呼べるようにしてしまうと
	//! シーン管理クラスとシーンクラスが相互に参照できるようになってしまうため、
	//! privateメンバになっています。
	//==============================================================
	void SetScene( ESceneType arg_eNewSceneType );
	
	//! コピーや生成をできないようするため、privateメンバにしてあります。
	CSceneManager( const CSceneManager& rhs );
	//! コピーや生成をできないようするため、privateメンバにしてあります。
	CSceneManager& operator=( const CSceneManager& rhs );
};

#endif

