๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ’ป Win32API

Scene, Object, Time

by eazuooz 2022. 9. 15.

Scene

์šฐ๋ฆฌ๊ฒŒ์ž„์˜ ๊ตฌ์กฐ๋Š” ์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋  ๊ฒƒ์ด๋‹ค.

์”ฌ ์•ˆ์—๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์”ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์ธ ๋ฉ”๋‰ด, ๊ฐ๊ฐ์˜ ๋ ˆ๋ฒจ ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์”ฌ ํŒŒ์ผ์€ ํ•œ ๋ ˆ๋ฒจ๋กœ ์ƒ๊ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์”ฌ์—์„œ๋Š” ํ™˜๊ฒฝ๊ณผ ์žฅ์• ๋ฌผ, ์žฅ์‹์„ ๋ฐฐ์น˜ํ•˜๊ณ  ๊ฒŒ์ž„์„ ์„ธ์„ธํ•˜๊ฒŒ ๋””์ž์ธํ•˜๊ณ  ๋งŒ๋“ญ๋‹ˆ๋‹ค.

	class Object;
	class Scene : public Entity
	{
	public:
		Scene();
		virtual ~Scene();

		virtual void Initialize() = 0;
		virtual void Tick();
		virtual void Render(HDC hdc);

		void AddObject(Object* object);

	private:
		std::vector<Object*> mObjects;
	};

 

SceneManager

๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ์˜ ์”ฌ์„ ๊ด€๋ฆฌํ•˜๋Š” SceneManager ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค.

Scene๊ณผ Scene์„ ๋„˜๋‚˜๋“œ๋Š” ์ž‘์—…์„ ํ• ๋–„ ์ด์šฉ๋˜๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์œผ์„œ ๋กœ๋”ฉ์ด ๋๋‚˜๋ฉด ํƒ€์ดํ‹€์”ฌ์œผ๋กœ ์ด๋™ํ•˜๊ณ  ๊ฒŒ์ž„์‹œ์ž‘์„ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์”ฌ์œผ๋กœ ์ด๋™ํ•˜๊ณ 

์˜ํ™”์ฒ˜๋Ÿผ ์žฅ๋ฉดํ•˜๋‚˜๋ฅผ ๋‹จ์œ„๋กœ ๊ฒŒ์ž„์„ ๊ตฌ์„ฑํ•ด์ฃผ๊ณ  ๊ทธ ์žฅ๋ฉด๋“ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ํด๋ž˜์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

	class Scene;
	class SceneManager
	{
		SINGLE(SceneManager)
	public:
		void Initialize();
		void Tick();
		void Render(HDC hdc);

	private:
		Scene* mScenes[SCENE_TYPE::END];
		Scene* mPlayScene;
	};

 

 

Game Object

๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ž€ ๋ ˆ๋ฒจ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋Š” ์ด๋™, ํšŒ์ „, ์Šค์ผ€์ผ๊ณผ ๊ฐ™์€ ํŠธ๋žœ์Šคํผ์„ ์ง€์›ํ•˜๋Š” ๋ฒ”์šฉ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.  ํ•œ๋งˆ๋””๋กœ ํ™”๋ฉด์ƒ์— ์กด์žฌํ•˜๋Š” UI, ๋ชฌ์Šคํ„ฐ, ํ”Œ๋ ˆ์ด์–ด ๋“ฑ๋“ฑ ์”ฌ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จ์œ„๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ถ€์†ํ’ˆ(component)๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด Transform ์€ ํฌ๊ธฐ ์ด๋™ ๊ฐ๋„ ๊ฐ™์€ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๊ณ  SpriteRenderer๋Š” ํ™”๋ฉด์ƒ์— ๊ทธ๋ฆผ์„ ๊ทธ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. AudioSource๋Š” ์†Œ๋ฆฌ๋ฅผ ์žฌ์ƒ์‹œ์ผœ์ฃผ๋Š” ์—ญํ• ์„ ํ•˜๊ตฌ์š”.

 

์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์”ฌ๊ณผ ๊ทธ ์”ฌ์•ˆ์— ์กด์žฌํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋ฐฐ์น˜ํ•˜์—ฌ ๊ฒŒ์ž„์„ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

	class Object : public Entity
	{
	public:
		Object();
		~Object();

		virtual void Tick() = 0;
		virtual void Render(HDC hdc);

	public:
		void SetPos(Vector2 pos) { mPos = pos; }
		void SetScale(Vector2 scale) { mScale = scale; }

		Vector2 GetPos() { return mPos; }
		Vector2 GetScale() { return mScale; }

	private:
		Vector2 mPos;
		Vector2 mScale;
	};

 

 

Time

๊ฒŒ์ž„์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ ํฐ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

๊ทธ๊ฑด ๋ฐ”๋กœ ๊ฒŒ์ž„์„  ์‹คํ–‰ํ•˜๋Š” ์ปดํ“จํ„ฐ์— ์‚ฌ์–‘์— ๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์†๋„๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

์‚ฌ์–‘์ด ์ข‹์€ ์ปดํ“จํ„ฐ๋ผ๋ฉด ๋™์ผํ•œ ์‹œ๊ฐ„๋™์•ˆ ํ•ด๋‹น ๋กœ์ง์„ 100๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ 100๋ฏธํ„ฐ ๋งŒํผ ์ด๋™ํ• ๊ฒƒ์ด๊ณ  

์‚ฌ์–‘์ด ์ข‹์ง€ ์•Š์€ ์ปดํ“จํ„ฐ๋ผ๋ฉด ๋™์ผํ•œ ์‹œ๊ฐ„๋™์•ˆ 10๋ฏธํ„ฐ ๋งŒํผ๋ฐ–์— ์ด๋™ํ•˜์ง€ ๋ชปํ• ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ ์‚ฌ์–‘๊ณผ ๊ด€๊ณ„์—†์ด ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

30ํ”„๋ ˆ์ž„ ๊ฒŒ์ž„์€ 100 * 0.02 = 2 => 2 * 30 = 60

60ํ”„๋ ˆ์ž„ ๊ฒŒ์ž„์€ 100 * 0.01 = 1 => 1 * 60 = 60

์ด๋Ÿฐ์‹์œผ๋กœ ์ฐจ๋“ฑ ๊ฐ’์„ ๊ณฑํ•ด์ฃผ์–ด ๊ฒฐ๊ณผ๊ฐ’์„ ๋งˆ์ถ”๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ €๊ธฐ์„œ 0.02, 0.01์€ 1ํ”„๋ ˆ์ž„๋‹น ์‹คํ–‰ํ•˜๋Š” ์‹œ๊ฐ„ (DeletaTime) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

Delta Time

Deleta Time์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2๊ฐ€์ง€ ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

QueryPerformanceFrequency ํ•จ์ˆ˜๋Š” ์ดˆ๋‹น CPU์˜ ๊ณ ์œ  ์ง„๋™์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

๋‹ค๋งŒ Window10๋ถ€ํ„ฐ๋Š” ๊ณ ์œ  ์ง„๋™์ˆ˜๊ฐ€ ์•„๋‹Œ 10,000,000์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๊ณ ์ •์ ์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

 

QueryPerformanceCount ํ•จ์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ์–ผ๋งˆ๋งŒํผ์˜ ์ง„๋™์ˆ˜๊ฐ€ ์ง€๋‚˜๊ฐ”๋Š”์ง€๋ฅผ ์ธก์ •ํ•ด์ค๋‹ˆ๋‹ค.

 

ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚ฌ์„๋•Œ ๊ฑธ๋ฆฐ ์ง„๋™์ˆ˜์—์„œ ํ”„๋กœ๊ทธ๋žจ์ด ์ฒ˜์Œ์— ์‹œ์ž‘ํ–ˆ์„๋•Œ ๊ฑธ๋ฆฐ ์ง„๋™์ˆ˜๋ฅผ ๋บด์ค€ํ›„

์šฐ๋ฆฌ CPU์˜ ๊ณ ์œ ์ง„๋™์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

    // HEADER
    class Time
	{
		SINGLE(Time)

	public:
		void Initialize();
		void Tick();
		void Render(HDC hdc);

	private:
		LARGE_INTEGER	mCpuFrequency;
		LARGE_INTEGER   mPrevFrequency;
		LARGE_INTEGER	mCurFrequency;

		float			mDeltaTime;
	};
    
    
    // CPP
    void Time::Initialize()
    {
        //CPU ์˜ ์ดˆ๋‹น ๋ฐ˜๋ณต๋˜๋Š” ์ฃผํŒŒ์ˆ˜๋ฅผ ์–ป์–ด์˜จ๋‹ค.
        QueryPerformanceFrequency(&mCpuFrequency);

        //ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ–ˆ์„๋•Œ์˜ CPU ํด๋Ÿญ ์ˆ˜
        QueryPerformanceCounter(&mPrevFrequency);
    }

    void Time::Tick()
    {
        QueryPerformanceCounter(&mCurFrequency);

        float differenceInFrequancy 
            = static_cast<float>((mCurFrequency.QuadPart - mPrevFrequency.QuadPart));

        mDeltaTime = differenceInFrequancy / static_cast<float>(mCpuFrequency.QuadPart);
        mPrevFrequency.QuadPart = mCurFrequency.QuadPart;
    }

 

'๐Ÿ“ Development Study > ๐Ÿ’ป Win32API' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Double Buffering  (0) 2022.09.19
Input  (0) 2022.09.15
Singleton Patten  (0) 2022.09.13
FrameWork  (1) 2022.09.07
DC์˜ ์ •๋ณด์ˆ˜์ •  (0) 2022.09.06

๋Œ“๊ธ€