//@STATE=作成中
//@DESCRIPTION ---------------------------------------------------------------
// AbstarctScene クラス
//	Sceneクラス(interfaceに相当)の抽象(abstract)クラス
//  ありがちなメソッドを実装
// 履歴:
// $Log: AbstractScene.cpp,v $
// Revision 1.1  2001/10/28 21:40:35  fujiwara
// DLLに分割
//
// Revision 1.5  2001/07/09 20:30:07  fujiwara
// 例外処理の組み込み
//
// Revision 1.4  2001/07/01 21:30:33  fujiwara
// メモリリークチェック見直し
//
// Revision 1.3  2001/07/01 01:03:43  fujiwara
// const の見直し
// 配置エディタは途中経過
//
// Revision 1.2  2001/05/12 00:48:13  fujiwara
// ＣＶＳを導入し、ログ表示を追加
//
//	2001/01/30 メモリーリーク検出用ライブラリインクルード
//@DESCRIPTION_END -----------------------------------------------------------
//@AUTHOR=S.F.
// Copyright (C) 2000 Satoshi Fujiwara. All Rights Reserved.

#pragma warning( disable : 4786 )	//STLの警告外し
#include "sfdebug.h"


#include <stack>
#include <list>

#ifdef _DEBUG
#define new DEBUG_NEW 
#endif

#include "exception.h"
#include "singleton.h"
#include "system.h"
#include "console.h"
#include "Scene.h"
#include "main.h"
#include "Obj.h"
#include "Obj2D.h"
#include "ObjQuadrangle.h"
#include "ObjRectangle.h"
#include "AbstractScene.h"

//////////////////////////////////////////////////////////////////////
// 構築/消滅
//////////////////////////////////////////////////////////////////////

using namespace sf::application::scene;
// コンストラクタ -------------------------------------------------------------
AbstractScene::AbstractScene()
{
	//mpListener = NULL;
	mpSystem = system::Factory::getInstance();
	mpConsole = mpSystem->console();
	mpSound = mpSystem->sound();
	mpInput = mpSystem->input();
	mpMain = application::MainFactory::getInstance();
	mbActive = true;

}// AbstarctScene

// デストラクタ ---------------------------------------------------------------
AbstractScene::~AbstractScene()
{

}// ~AbstarctScene

// リスナーを設定する ---------------------------------------------------------
void AbstractScene::addListener(Listener *pListener)
{
	mListenerList.push_back(pListener);
} //addListener()

void AbstractScene::removeListener(Listener *pListener)
{
	for(std::list<Listener *>::iterator it = mListenerList.begin();it != mListenerList.end();++it)
	{
		if(*it == pListener){
			*it = NULL;
			//mListenerList.erase(it);
			return;
		}
	}
} //removeListener()

// イベント呼び出しメソッド 
void AbstractScene::callSceneEvent(void(Listener::* const pMethod)(Scene* const ))
{
	std::list<Listener *>::iterator it = mListenerList.begin();
	
//	sf::application::scene::Container *pc = sf::application::scene::Container::instance();

	while(it != mListenerList.end())
	{
		if(*it != NULL){
			((*it)->*pMethod)(this);
			++it;
		} else {
			it = mListenerList.erase(it);
		}
	}
}