๊ฒ์ ์คํ ์ดํธ ๋งค๋์ ๋ ๊ฒ์ ์คํ ์ดํธ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ ๊ฐ์ฒด๋ผ ๋ณด๋ฉด ๋จ.
๋ฌผ๋ก ๊ฐ์ฒด๊ฐ ์๋ C๋ผ๊ณ ๊ฒ์ ์คํ ์ดํธ ๋งค๋์ ๋ฅผ ๋ชป์ง๋ ๊ฒ๋ ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ณด๋ค๋ ๊ด๋ฆฌ์ ์ง์คํด์ฃผ๋ฉด ์ข๊ฒ ์.
(ํจ์ํฌ์ธํฐ๋ก ๊ตฌํํ๋ฏ ๋๋๋ค.)
๊ธฐ๋ณธ์ ์ผ๋ก ๊ฒ์ ์คํ ์ดํธ๋
Load
Initialize
Update
Draw
Shutdown
Unload(Free)
๋ฑ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค ๋ณด์๋ฉด ๋ฉ๋๋ค.
์ ๋ํฐ์์ ๊ฒ์ ์ฌ? ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋? ์ ๋ํฐ๋ฅผ ์ ๋ง์ ธ๋ด์ ์์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋์ถฉ ๋๊ปด์ง๋ ๋ฐ๋ก๋ ์ด๋ฐ ๋๋์ผ๊ฑฐ์.
์ฌ๊ธฐ์ ์ถ๋ฆฌ๊ณ ์ถ๋ ค์
Initialize, Update, Shutdown
์ด ์ธ๊ฐ์ง๋ง ๋๋ฐ๋ก ๊ตฌํํด๋ ๋ณ ๋ฌธ์ ๊ฐ ์์.
์ด์ ๋ ๊ณผ๊ฑฐ์ ๊ฒ์์ ๋ก๋ฉ์ ์ฌ๋ณ๋ก ๋ฐ๋ก๋ฐ๋ก ํด์ผํ ๋งํผ ๋จ์ด ์์์ย
๋ก๋ฉ์ ์คํ ์ดํธ ๋จ๊ณ์ ์ถ๊ฐ์์ผฐ์ง๋ง
์์ฆ์ ๋จ์ด ๊ทธ๋ ๊ฒ ์๋ถ์กฑํ๋ ๋ก๋ฉ์ ์คํ ์ดํธ๋ง๋ค ํด์ค ํ์๊ฐ ์๋๊ฒ์.
์๋ง ์คํ์๋ ๊ฒ์์ ๋๋ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ค์ ๋ก๋ฉ์ํค๊ฒ ์ง๋ง ์์งํ ๋์ผ๋ก๋ด์ ์ฒด๊ฐ์ด ์๋๋๊น ๊ฑฐ๋ฆ ์๋ค.
Draw๋ํย ์ ๋ฐ์ดํธ๋ ๊ฒน์น๋๋ฐ, ์๋ ์ ์์ง ๋ถ๋ถ๊น์ง ์์ ๋ง๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ Draw ๋จ๊ณ๊ฐ ๋ค์ด์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋๊ฑฐ์.
๊ฑ ํ์ย ์์คํ ์ ํ๋ ์ถ๊ฐ๋ก ๋ง๋ ํ์ ๊ฑฐ๊ธฐ๋ค๊ฐ ๊ทธ๋ฆด ์น๊ตฌ๋ค๋ง ๊ทธ๋ ค์ฃผ๋ฉด ๋๋๊น
์คํฌ๋ฆฝํธ ์์ค์ ๊ฒ์ ๋ก์ง์ด ๋์๊ฐ๋ ๋ฃจํ์์ ๋นผ๋ฒ๋ ค๋ ๋ฌด๋ฐฉํ๊ฑฐ์.
๋ง์ฐฌ๊ฐ์ง๋ก Unload ๋ํ ๋งค๋ฒ Load ํ ํ์๊ฐ ์์ผ๋ ๋น ์ง๊ฒ ๋๋๊ฒ.
์ค์ ๊ฒ์์์ ์ด๋ค์์ผ๋ก ๋์๊ฐ๊น?
Initialize();
Update();
Update();
Update();
.
.
.
Update();
Shutdown();
์ด๋ฐ์์ผ๋ก ๋๊ณ ๋์ด๋ผ ๋ณด๋ฉด ๋จ.
ํ๋ ์ด์ด๊ฐ ๊ฒ์์ ํ๋ค๊ฐ ๋ฉ๋ดํ๋ฉด์ผ๋ก ๋์ด๊ฐ๋ค๋์ง, ๊ฒ์์ ๋๋ค๋์ง ๋ฑ๋ฑ์ ํ๋์ ํ๋ฉด
Shutdown ํ๊ณ ๋๋ด๋ ๊ฑฐ์.
๊ฒ์ ์คํ ์ดํธ๊ฐ ์ด๋ ๊ฒ ๊ตด๋ฌ๊ฐ๋ฉด ์คํ ์ดํธ ๋งค๋์ ๋ ์ด๋ป๊ฒ ๊ตด๋ฌ๊ฐ๊น?
๋น์ฐํ ์คํ ์ดํธ๋ค์ ๊ด๋ฆฌํด์ฃผ๋๊ฒ ์คํ ์ดํธ ๋งค๋์ ์.
์คํ ์ดํธ๋ผ๋ ๊ฐ์ฒด๋ค์ ์์ฑํ๊ณ , ์ง์ฐ๊ณ ๋ฑ๋ฑ์ ์ผ๋ จ์ ๊ณผ์ ์ ํด์ฃผ๋๊ฑฐ.
์คํ ์ดํธ ๋งค๋์ ์ ํต์ฌ์
์คํ ์ดํธ ์ ํ,
์คํ ์ดํธ ์ผ์์ ์ง, ์ฌ๊ฐ
์ ๋๊ฐ์ง์ธ๊ฑฐ ๊ฐ์.
์คํ ์ดํธ๊ฐ์ ์ ํ์์ผ์ฃผ๋๋ฐ ์คํ ์ดํธ ๋ฐ๊นฅ์์ ๋์๊ฐ ์ ๋ณด๋ฅผ ์ ๋ฌํด์ค๋ค๋์งย
์คํ ์ดํธ๋ฅผ ์ผ์์ ์งํ๊ณ ๋ค๋ฅธ ์คํ ์ดํธ๋ฅผ ๋๋ฆฌ๋ค๊ฐ ์ผ์์ ์ง๋ฅผ ํ๋ฉด ์ ๋๋ก ์๋ ๋๋ ์คํ ์ดํธ๊ฐ ๋ฉ์ฉกํ ๋๋ค๋์ง
์ด๋ฐ ์ญํ ์ ํด์ฃผ๋๊ฒ ์คํ ์ดํธ ๋งค๋์ ์ ๋ณธ ์ญํ ์.
์๋๋ ๋ด๊ฐ 1ํ๋ ๋ง์ ์ผ์์ ์ง, ์ฌ๊ฐ๋ฅผย stack์ผ๋ก ๊ตฌํํ๋๊ฑด๋ฐ
void GameStateManager::PauseAndSetNext(StageType stageType)
{
m_isPausing = true; //Pause ์ํ๋ก ๋ฐ๊พผ๋ค.
PauseInfo pauseInformation; //์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
pauseInformation.type = m_current; // ์ ๋ณด ์ ์ฅ
pauseInformation.pStage = m_pStage; //์ ๋ณด ์ ์ฅ
m_pauseStack.push(pauseInformation); // ์คํ์ ์ค์ ๋ฃ๋๋ค.
m_next = stageType; //์คํ ์ดํธ๋ฅผ ์ ํ ์ํค๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋น๊ธด๋ค.
}
์ด๋ ๊ฒ ์ ์ฅํด๋๊ณ
๋ฉ์ธ ๋ฃจํ์์ ์คํ ์ดํธ๋ค์ shutdown์ด๋ unload๋ฅผ ํ์ง์๊ณ ๋๊ธด ๋ค์์
๋ฐ๋ ๋ค์ ์คํ ์ดํธ๋ฅผ initialize ํด์คฌ์.
์ด๊ฑด ์ฌ๊ฐ ํ ๋ ๋ถ๋ฅด๋ ํจ์
voidย GameStateManager::Resume(void)
{
if (m_pauseStack.empty() == false)
{
m_isResuming = true; //์ฌ๊ฐ ์ํ๋ก ๋ฐ๊พผ๋ค.
m_next = m_pauseStack.top().type; //์คํ์ ๊ฐ์ฅ ์์ ์๋ ํ์ ์ผ๋ก ๋ฐ๊พผ๋ค.
}
else
{
//error //์คํ์ด ๋น์์ ๋. ์๋ฌด์ผ๋ ์ผ์ด๋์ง ์๋๋ค.ย
ย ย //์ด๋ด๋ assert ๊ฑธ์ด์ ๋ถ๋ฅด๋ฉด ์๋๋๋ฐ ๋ถ๋ฅธ๊ณณ์ ์ฐพ์ผ๋ฉด ๋จ.
}
}
์ฌ๊ฐํ๋ ์ํ๊ฐ ๋๋ฉด ์ ์์ ์ผ๋ก ์ข ๋ฃ๋ฅผ ํด์ฃผ๊ณ ,
Initialize ํด์ค๋ ์ฌ๊ฐ์ธ์ง ์ ์์ ์ธ ์์์ธ์ง ๊ตฌ๋ถํด์ย ๋ค๋ฅด๊ฒ ๋ถ๋ฌ์ฃผ๋ฉด ๋จ.
if (m_isResuming == true)
{
m_isResuming = false; //๋ฆฌ์ค ์ํ ํด์
delete m_pStage; //๊ธฐ์กด ์คํ ์ดํธย ์ญ์
m_pStage = 0;ย
m_pStage = m_pauseStack.top().pStage; //์ ์ฅ๋ ์คํ ์ดํธ๋ก ๋ณ๊ฒฝ
m_current = m_next; // ํธ๋ฆฌ๊ฑฐ ์ผ์น
m_pauseStack.pop(); //์คํ์์ ์ ๊ฑฐ.
}
else
{
//Init current stage
m_pStage->Initialize();ย
}
๊ทธ๋ ์คํ์ ์ผ๋ ์ด์ ๊ฐ LIFO ๋ผ์์ธ๋ฐ,ย
์์งํ ์ด๋ค ์๋ฃ๊ตฌ์กฐ๋ฅผ ์จ๋ ๊ตฌํ์ ์ฐจ์ด๋ง ์์๋ฟ์ด๋ผ ์๊ฐํจ.
๊ทธ๋ฅ List๋ฅผ ์จ๋ ๋ณ ๋ฌธ์ ์์๊ฑธ?ย
๊ฒฐ๋ก ์ ๋จธ๋๊ฒ์? ์ฝ์์ฐฝ๊ฒ์?ย ์ด๋ฐ ๊ฒ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด
์ด์ ๋ ๊ฒ์ ์คํ ์ดํธ ๋งค๋์ ๋ง ๋ง๋ค์ด๋ฌ๋ ์ถฉ๋ถํย ๊ฐ๋ฐํ ์ ์์๊ฒ์.
๋ญ ์ถ๊ฐ๋ก ์ฝ์์ฐฝ์ ๊ทธ๋ฆฌ๋ ๋ฒ์ด๋ ์ด๋ฐ๊ฑด ์ฐพ์๋ด์ผ๊ฒ ์ง๋ง ์กฐ๊ธ ๋ง ๋ ๊ณต๋ถํด์
์๊ธฐ๋ง์ ๊ฒ์์์ง์ ๊ฐ์ง๋ค๋๊ฑด ์ ๋ง ๋ฉ์ง์ผ์ด๊ฑฐ๋ .ย
๋์ผ C++ ์์ฃผ๋ก ๊ณต๋ถํด์ C++์ ์ฐ์ง๋ง
C๋ ๋ค๋ฅธ ์ธ์ด๋ฅผ ์ฐ๋๋ผ๋ ์๋ ๊ฐ๋จํ ์ฝ๋๋ผ ๋ณ ๋ฌธ์ ๋ ์์๊ฑฐ์.ย
์ค ์ข๋น