/**
 * @file
 * @brief シーンインターフェース、およびその関連定義を行う.
 * 
 * @author S.F.
 * @version $Id:
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */

/// 重複インクルード防止マクロ
#ifndef SCENE_H
#define SCENE_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "singleton.h"
#include "sfinterface.h"
#include "scenetype.h"
namespace sf {
	namespace application {
		/// シーンに関連するものはすべてこの名前空間に含まれます。
		namespace scene{

			class Scene;
			class Listener;

			/** シーンインターフェース.
			 * シーンとは、このゲーム中ではスタート画面、ゲーム画面、タイトル画面．．．などのことを指します。
			 * シーン切り替え時に行われるトランジションも１つのシーンとしてとらえてます。
			 */
			class SF_INTERFACE Scene 
			{
			public:
				/// コンストラクタ
				Scene() {};
				/// デストラクタ
				virtual ~Scene() {};
				// OPERATORS //
				// OPERATIONS //
				/// シーンを実行する
				virtual void move(void) = 0;
				/** シーンが発行するイベントを受け取るListenerインターフェースを登録する 
				 * @param Listener のポインタ */
				virtual void addListener(Listener * const pListener) = 0;

				/** シーンが発行するイベントを受け取るListenerインターフェースを削除する 
				 * @param Listener のポインタ */
				virtual void removeListener(Listener * const pListener) = 0;
				/** シーンを休止する */
				virtual void sleep(void) = 0;
				/** シーンをアクティブにする */
				virtual void active(void) = 0;
				// ACCESS //
				/** シーンの種類を取得する
				 * @return scent::Type */
				virtual const scene::TYPE  type() const = 0;
				// INQUIRY //
				/** シーンの状態を取得する
				 @retval true 活動中 
				 @retval false 休止中 */
				virtual const bool  isActive(void) const = 0;
			};// Scene()

			/** Sceneを生成するメソッド */
			typedef Scene *(*CreateSceneMethod)(int);
	
		
			/** イベントリスナーインタフェース */
			class SF_INTERFACE Listener 
			{
			public:
				/**  シーンが終了した 
				 @param pScene Scene インターフェースのポインタ */
				virtual void endOfScene(Scene * const pScene) = 0;
				/**  ExitKeyが押された
				 @param pScene Scene インターフェースのポインタ */
				virtual void exitKeyPressed(Scene * const pScene) = 0;
			};// Listener

		}// scene
	}// application
}// sf

#endif