๊ฒŒ์ž„ ์Šคํ…Œ์ดํŠธ ๋งค๋‹ˆ์ €๋Š” ๊ฒŒ์ž„ ์Šคํ…Œ์ดํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ฐ์ฒด๋ผ ๋ณด๋ฉด ๋จ.


๋ฌผ๋ก  ๊ฐ์ฒด๊ฐ€ ์—†๋Š” 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๋‚˜ ๋‹ค๋ฅธ ์–ธ์–ด๋ฅผ ์“ฐ๋”๋ผ๋„ ์›Œ๋‚™ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋ผ ๋ณ„ ๋ฌธ์ œ๋Š” ์—†์„๊ฑฐ์ž„.ย