Programming/Mgr

상태패턴을 활용한 Game Scene 변경 매니져 - 2

사기꾼프로드 2013. 12. 3. 23:00

상태패턴 씬 매니져

cSceneMgr.h

#pragma once
#include "cScene.h"
#include "cGame.h"
#include "cIntro.h"
#include "cMenu.h"
// 씬을 다 인클루드 본래는 헤더파일에서 이렇게 참조해대면 안좋습니다. 웬만하면 cpp에서 참조하도록 짤것

enum Scene_State // 씬상태를 표시할 enum
{
	INTRO,
	MENU,
	GAME
};

class cScene_Mgr
{
private:
	cScene_Mgr(void);
	static	cScene_Mgr*	m_cScene_Mgr_Inst; //씬매니져 싱글톤을 위한 클래스 포인터 변수
			CScene*		m_pcScene;
			Scene_State	m_RsvScene;		// 변경될 씬 예약 Rsv = Reservation
			Scene_State	m_NowScene;		// 현재 씬
			bool		m_bSceneChage; // 씬이 변경될것인가 유무
			bool		m_bGameEnd;

public:
	~cScene_Mgr(void);
	static	cScene_Mgr*	GetInst(void);
			void		Init(HWND hwnd);
			void		FreeInst(void);
			void		SceneChange(Scene_State State);
			void		Update(void);
			void		Render(void);
	inline	void		ReservationChange(Scene_State State) // 씬 변경 예약함수
	{
		m_RsvScene		=	State;
		m_bSceneChage	=	true;
	}
	inline	Scene_State	GetRsvScene	(void)	// 예약된 씬을 얻어옴
	{
		return m_RsvScene;
	}
	inline	bool		GetbSceneChange(void)	// 예약유무를 얻어옴
	{
		return m_bSceneChage;
	}
	inline	void		SetGameEnd(bool bEnd)    // 게임이 종료될 것인가?
	{
		m_bGameEnd	=	bEnd;
	}
	inline	bool		GetGameEnd(void)  // 게임이 종료되었는가?
	{
		return m_bGameEnd;
	}
	inline	Scene_State	GetNowScene(void) // 현재 씬을 반환
	{
		return m_NowScene;
	}
};
cSceneMgr.cpp
#include "cSceneMgr.h"

cScene_Mgr*	cScene_Mgr::m_cScene_Mgr_Inst	=	NULL;

cScene_Mgr::cScene_Mgr(void)
{
}

cScene_Mgr::~cScene_Mgr(void)
{
}
void	cScene_Mgr::Init(HWND hwnd) // 씬매니져 초기화
{
	m_bSceneChage	        =	false;
	m_bGameEnd		=	false;
	m_pcScene		=	new CIntro; // 첫번째 씬을 인트로로
	m_NowScene		=	INTRO; // 첫번째 씬을 인트로로
	m_pcScene->Init();			// 씬 초기화
}
cScene_Mgr*	cScene_Mgr::GetInst(void)
{
	if (m_cScene_Mgr_Inst == NULL)
	{
		m_cScene_Mgr_Inst = new cScene_Mgr;
	}
	return m_cScene_Mgr_Inst;
}
void	cScene_Mgr::FreeInst(void)
{
	if (m_cScene_Mgr_Inst != NULL)
	{
		if ( m_pcScene != NULL )
		{
			m_pcScene->Free(); // 씬이 파괴되기 전에 해당씬을 할당해제해줌
			delete m_pcScene;
			m_pcScene	=	NULL;
		}
		delete m_cScene_Mgr_Inst;
		m_cScene_Mgr_Inst	=	NULL;
	}
}

void	cScene_Mgr::SceneChange(Scene_State State)
{
	if ( m_pcScene != NULL )
	{
		m_pcScene->Free();			// 씬 해제
		delete m_pcScene;
		m_pcScene	=	NULL;
	}
	switch ( State )
	{
	case INTRO:
		{
			m_pcScene	=	new CIntro;
			m_NowScene	=	INTRO;
			break;
		}
	case MENU:
		{
			m_pcScene	=	new CMenu;
			m_NowScene	=	MENU;
			break;
		}
	case GAME:
		{
			m_pcScene	=	new CGame;
			m_NowScene	=	GAME;
			break;
		}
	}
	m_pcScene->Init();			// 씬 초기화
	m_bSceneChage	=	false;
}

void	cScene_Mgr::Update(void)
{
	m_pcScene->Update();
}

void	cScene_Mgr::Render(void)
{
	m_pcScene->Render();
}