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(); }