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 |
๋๊ธ