๊ฒ์์๋ ์ฌ๋ฌ๊ฐ์ง ์ฌ์ด ์กด์ฌํ๋ค. ์ฌ์ ์ด๋ป๊ฒ ๊ตฌํ๋ ๊น?
๊ฒ์ ๋ด์๋ ์ ๋ง์ ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋๋ฐ ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ฌ์ด๋ผ ๋ณผ ์ ์๋ค.
- ์ฌ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
์ฌ๊ธฐ์ ์ค๋ธ์ ํธ๋ฅผ ๊ด๋ฆฌํ ๊ฒ์ธ๋ฐ ์ฌ๋ ์ฌ๋ฌ ๊ฐ์ง ์ฌ์ผ๋ก ๋๋๊ธฐ์ ์์์ผ๋ก ๊ตฌํ๋๋ค. ์ฌ์ ์กด์ฌํ๋ ์ค๋ธ์ ํธ๋ฅผ ์ฌ๋ฌ ๊ทธ๋ฃน์ผ๋ก ๋๋ ๊ตฌ๋ณํ๊ธฐ ์ํด ์๋์ฒ๋ผ enum class๋ฅผ ์ฌ์ฉํ๋ค.
// define.h์ ์ถ๊ฐ
enum class GROUP_TYPE {
DEFAULT,
PLAYER,
MISSTLE,
MONSTER,
END = 32,
};
// Scene.h ์์ฑ
class Object; // ์ ๋ฐฉ์ ์ธ
class Scene {
private:
vector<Object*> arrObj[(UINT)GROUP_TYPE::END];
wstring strName;
public:
Scene();
virtual ~Scene();
void SetName(const wstring& _strName) { strName = _strName; }
const wstring& GetName() { return strName; }
void update();
void render(HDC _hdc);
virtual void Enter() = 0;
virtual void Exit() = 0;
protected:
void AddObject(Object* obj, GROUP_TYPE type)
{
arrObj[(UINT)type].push_back(obj);
}
};
์ ๋ฐฉ์ ์ธ : ์ปดํ์ผ ์๋์ ๋ถ๋ด ๋๊ธฐ ์ํด ์ฌ์ฉ. ์๋์์ Object ํค๋ ํ์ผ ๋ด๋ถ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ Scene ํ์ผ์ ๋ค์ ์ปดํ์ผ ๋์ง ์์.
Scene ํด๋์ค๋ ์์ฑ๋๋ ๋ชจ๋ ์ฌ์ ๋ถ๋ชจ ํด๋์ค๋ค.
private์ผ๋ก ์ ์ธ๋ arrObj์ strName์ ๊ฐ๊ฐ ์ค๋ธ์ ํธ๋ฅผ ์ ์ฅ ๋ฐ ๊ด๋ฆฌํ ๋ฒกํฐ๋ฅผ ๊ทธ๋ฃน ๊ฐ์๋งํผ ์ ์ธํ ๋ณ์์ ์ฌ ์ด๋ฆ์ ๋ํ๋ด๋ ๋ณ์์ด๋ค.
Object๊ฐ ํฌ์ธํฐ๋ก ์ค๋ ์ด์ ๋ ์์ ํด๋์ค ํ์ ๋ค์ ๋ถ๋ชจ ํฌ์ธํฐ ํ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๊ธฐ์ ๋ถ๋ชจ ํด๋์ค์ธ Object์ ํฌ์ธํฐ๋ก ๊ฐ์ ธ์จ ๊ฒ.
์์์ ์ธ๊ธํ์ ๋ฏ์ด ์ฌ์ ์ฌ๋ฌ ๊ฐ๊ฐ ์กด์ฌํ๊ธฐ์ ์ด๋ค์ ๊ด๋ฆฌํ๋ Scene Manager๊ฐ ํ์ํ๋ค.
// SceneManager.h
class Scene;
class SceneManager{
SINGLE(SceneManager);
private:
Scene* arrScene[(UINT)SCENE_TYPE::END];
Scene* currScene;
public:
void init();
void update();
void render(HDC _hdc);
};
์ด ์น๊ตฌ๋ ์ฌ๋ฌ ์ฌ์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ฌ์ ๋ชฉ๋ก๊ณผ ํ์ฌ ์ด๋ค ์ฌ์ธ์ง๋ฅผ ๊ฐ๊ณ ์์ด์ผ ํ๋ค.
๊ฐ๊ฐ arrScene์ currScene ๋ณ์๊ฐ ์ด๋ฅผ ์๋ฏธํ๋ค.
์ง๊ธ๊น์ง ๋ง๋ ๊ฒ์ ์ฌ์ ๋ถ๋ชจ์ด์ ํ ๋๊ฐ ๋๋ ์น๊ตฌ๋ค์ด๋ค.
๋ง์ฝ ๊ฒ์์ ์์ํ๋ Start Scene์ ๊ตฌํํด๋ณด์.
// Scene_Start.h
#include "Scene.h"
class Scene_Start : public Scene {
public:
Scene_Start();
~Scene_Start();
virtual void Enter();
virtual void Exit();
};
Scene_Start::Scene_Start()
{
}
Scene_Start::~Scene_Start()
{
}
void Scene_Start::Enter()
{
// Object ์ถ๊ฐ
Object* obj = new Object;
obj->setPos(Vec2(640.f, 384.f));
obj->setScale(Vec2(100.f, 100.f));
AddObject(obj, GROUP_TYPE::DEFAULT);
}
void Scene_Start::Exit()
{
}
์ฌ์ Enterํจ์์ Exitํจ์์๋ ๊ฐ๊ฐ ์ฌ์ ์ง์ ํ ๋์ ํ์ถํ ๋ ํด์ผ ํ๋ ์์ ์ ์ํํด์ผ ํ๋ค. ์ด Enter()์ Exit()๋ ๋ชจ๋ ์ฌ์ ํฌํจ๋์ด์ผ ํ๊ธฐ์ ๋ถ๋ชจ์ธ ์ฌ ํด๋์ค ๋ด๋ถ์์ ๊ฐ์ ํจ์๋ก ๋ง๋ค์ด ์์ ๋ฐ๊ณ ์๋ ์์ ๋ฐ๋ ์์ ํด๋์ค๊ฐ ์์ ๋ง์ ๋ฒ์ ์ ๊ตฌํํ๋๋ก ๊ฐ์ ํด์ผ ํ๋ค. ( ์ฆ Enter๊ณผ Exit ํจ์๋ ์ฌ๊ธฐ์ ์ธํฐํ์ด์ค ํจ์์ )
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฌ์ Scene ํด๋์ค๋ฅผ ์์๋ฐ๋๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ์ ์ ์๋ฉธ์์ virtual ํค์๋๊ฐ ๋ถ์ด์ผ ํ๋ค.
๊ฐ์ ํจ์๊ฐ ์์๋ค๋ฉด ๋ถ๋ชจ ํด๋์ค์ ์๋ฉธ์๋ง ํธ์ถ๋๊ณ ์์ ํด๋์ค์ ์๋ฉธ์๊ฐ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์, Scene, Object ํด๋์ค์ ๊ฐ์ ์์์ด ๋ชฉ์ ์ด ๋๋ ํด๋์ค๋ ๋ฐ๋์ ์๋ฉธ์์ virtual์ ๋ถ์ฌ์ผ ํจ!
Scene_Start class ์ฒ๋ผ ๊ฐ์ ํจ์๋ฅผ ๋ถ๋ชจ ํด๋์ค๋ก๋ถํฐ ์์ ๋ฐ๋ ์ ์ฅ์ด๋ผ๋ฉด, ๊ตณ์ด virtual ํค์๋๋ฅผ ๋ถ์ผ ํ์๊ฐ ์๋ค. ํ์ง๋ง ๋ช ์์ ์ผ๋ก ๊ฐ์ํจ์์์ ํ์ํ๊ธฐ ์ํด ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
Enter ํจ์ ๋ด๋ถํฐ์์๋ ๋ณธ๊ฒฉ์ ์ธ ์ค๋ธ์ ํธ๋ฅผ ์ถ๊ฐํ๊ฒ ๋๋๋ฐ ๊ฐ๋ฐ์๊ฐ ๋์ ์ผ๋ก ๋ง๋๋ ์ ๋ค์ด๊ธฐ์ ์๋ฉธ์์ผ ์ฃผ์ด์ผ ํ๋ค. ์ด๋์? → ์์์ ์ด์ฉํ๋ ์ด์ ๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ ์๋ค. ๊ตณ์ด ์ด ํด๋์ค ๋ด๋ถ์์ ํ๋ํ๋ ํด์ ํ๋ ๊ฒ์ด ์๋ ๋ถ๋ชจ ํด๋์ค์ธ Scene ๋ด๋ถ์์ ์ง์์ฃผ๋ฉด ๋๋ค.
// Scene.cpp
Scene::~Scene()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i)
for (size_t j = 0; j < arrObj[i].size(); ++j)
// arrObj[i] ๊ทธ๋ฃน ๋ฒกํฐ์ j๋ฌผ์ฒด ์ญ์
delete arrObj[i][j];
}
์ค๋ธ์ ํธ ์ถ๊ฐ๋ ์๋์ ํจ์๋ฅผ ์ด์ฉํด์ ํ๋ค.
// Scene.h
protected:
void AddObject(Object* obj, GROUP_TYPE type)
{
arrObj[(UINT)type].push_back(obj);
}
+ ๋ฒกํฐ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ง ์๋ ์ด์ ๋ฉ๋ชจ๋ฆฌ ์ ๋จน์ ( ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋๊ธฐ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์. ๋ฒกํฐ ์์ฒด์ ๋ฉํ๋ฐ์ดํฐ(์: ํฌ์ธํฐ, ํฌ๊ธฐ, ์ฉ๋ ๋ฑ)๋ง์ ์ ์งํ๊ธฐ ์ํ ์ฝ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ง ์ฌ์ฉํจ - ๋ฒกํฐ = ๋์ ๋ฐฐ์ด )
์ฌ์ ๋ฐ๋ผ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๊ณ ๊ทธ๋ฆฌ๊ธฐ ์ํด์๋ ๊ธฐ์กด Core ์ฝ๋๋ ์์ ํ ํ์๊ฐ ์๋ค. ์ฌ ๋งค๋์ ๋ํ ์ฝ์ด ๋ด๋ถ์์ Initํจ์์ updateํจ์๋ฅผ ๋ถ๋ฌ์์ผ ํ๊ณ ์ถ๊ฐ์ ์ผ๋ก ํด๋น ์ฌ์ ๊ทธ๋ฆฌ๋ renderํจ์๋ ์ถ๊ฐ๋์ด์ผ ํ๋ค.
#include "SceneManager.h" //์ถ๊ฐ
int Core::Init(HWND _handle, POINT _ptResolution)
{
//...
// Manager์ด๊ธฐํ
TimeManager::Instance()->Init();
KeyManager::Instance()->init();
SceneManager::Instance()->init(); // ์ถ๊ฐ - ๋ชจ๋ ์ฌ ์์ฑ
// ..
}
void Core::Progress() // ์์
{
// Manager update
TimeManager::Instance()->update();
KeyManager::Instance()->update();
SceneManager::Instance()->update();
// Rendering
// ํ๋ฉด clear
Rectangle(mDC, -1, -1, ptResolution.x + 1, ptResolution.y + 1);
SceneManager::Instance()->render(mDC);
BitBlt(hDC, 0, 0, ptResolution.x, ptResolution.y, mDC, 0, 0, SRCCOPY);
}
์ฌ ๋งค๋์ ๋ด๋ถ์์๋ ์ด ๊ฐ ํจ์๊ฐ ์ด๋ป๊ฒ ๊ตฌํ๋ ๊น?
๊ฐ ํจ์๊ฐ ํ๋ ์ผ๊ณผ ๊ทธ ๋ด๋ถ ๊ตฌํ์ ์๋์ ๊ฐ๋ค.
#include "pch.h"
#include "SceneManager.h"
#include "Scene_Start.h"
SceneManager::SceneManager()
:arrScene{}
,currScene(nullptr)
{
}
SceneManager::~SceneManager()
{
// ์ฌ ์ ๋ถ ์ญ์
for (UINT i = 0; i < (UINT)SCENE_TYPE::END; ++i)
if (nullptr != arrScene[i])
delete arrScene[i];
}
void SceneManager::init()
{
// Scene ์์ฑ
arrScene[(UINT)SCENE_TYPE::START] = new Scene_Start;
arrScene[(UINT)SCENE_TYPE::START]->SetName(L"Start Scene");
// arrScene[(UINT)SCENE_TYPE::TOOL] = new Scene_Tool;
// arrScene[(UINT)SCENE_TYPE::STAGE_01] = new Scene_Stage01;
// arrScene[(UINT)SCENE_TYPE::STAGE_02] = new Scene_Stage02;
// ํ์ฌ ์ฌ ์ง์
currScene = arrScene[(UINT)SCENE_TYPE::START];
currScene->Enter();
}
void SceneManager::update()
{
// ํ์ฌ ์ฌ ์
๋ฐ์ดํธ
currScene->update();
}
void SceneManager::render(HDC _hdc)
{
// ํ์ฌ ์ฌ ๊ทธ๋ฆฌ๊ธฐ
currScene->render(_hdc);
}
๊ทธ๋ ๋ค๋ฉด ์ฌ๊ธฐ์ ํ์ฌ ์ฌ์ Scene ํด๋์ค์ ํฌ์ธํฐ์์ผ๋ก ์ฌ ํด๋์ค ์์ฒด์์๋ updateํจ์์ renderํจ์๋ ๊ตฌํ๋์ด์ผ ํ๋ค.
#include "pch.h"
#include "Scene.h"
#include "Object.h"
Scene::Scene()
{
}
Scene::~Scene()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i)
for (size_t j = 0; j < arrObj[i].size(); ++j)
// arrObj[i] ๊ทธ๋ฃน ๋ฒกํฐ์ j๋ฌผ์ฒด ์ญ์
delete arrObj[i][j];
}
void Scene::update()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
for (size_t j = 0; j < arrObj[i].size(); ++j) {
arrObj[i][j]->update();
}
}
}
void Scene::render(HDC _hdc)
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
for (size_t j = 0; j < arrObj[i].size(); ++j) {
arrObj[i][j]->render(_hdc);
}
}
}
์ด๋ฌ๋ฉด ๊ฐ ์ค๋ธ์ ํธ ๋ํ update์ renderํจ์๊ฐ ์กด์ฌํด์ผ ํ๊ธฐ์ Object ํด๋์ค๋ ์๋์ฒ๋ผ ๋ณ๊ฒฝ๋๋ค.
// Object.h
class Object {
private:
Vec2 vPos;
Vec2 vScale;
public:
Object();
virtual ~Object();
void setPos(Vec2 _vPos) { vPos = _vPos; }
void setScale(Vec2 _vScale) { vScale = _vScale; }
Vec2 getPos() { return vPos; }
Vec2 getScale() { return vScale; }
public:
void update();
void render(HDC _hdc);
};
// Object.cpp
#include "pch.h"
#include "Object.h"
#include "KeyManager.h"
#include "TimeManager.h"
Object::Object()
: vPos{}
, vScale{}
{
}
Object::~Object()
{
}
void Object::update()
{
if (KeyManager::Instance()->GetKeyState(KEY::W) == KEY_STATE::HOLD) {
vPos.y -= 200.f * DT;
}
if (KeyManager::Instance()->GetKeyState(KEY::S) == KEY_STATE::HOLD) {
vPos.y += 200.f * DT;
}
if (KeyManager::Instance()->GetKeyState(KEY::A) == KEY_STATE::HOLD) {
vPos.x -= 200.f * DT;
}
if (KeyManager::Instance()->GetKeyState(KEY::D) == KEY_STATE::HOLD) {
vPos.x += 200.f * DT;
}
}
void Object::render(HDC _hdc)
{
// ๊ฐ์ ์๊ธฐ๊ฐ ์๊ธฐ๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋จ
Rectangle(_hdc, (int)(vPos.x - vScale.x / 2.f), (int)(vPos.y - vScale.y / 2.f),
(int)(vPos.x + vScale.x / 2.f), (int)(vPos.y + vScale.y / 2.f));
}
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 09] ๊ธฐ์ด ์ํ (0) | 2024.06.05 |
---|---|
[winAPI 08] Object (0) | 2024.06.05 |
[winAPI 06] Key Manager (1) | 2024.06.04 |
[winAPI 05] Double Buffering (0) | 2024.06.04 |
[winAPI 04] Timer (0) | 2024.04.09 |