์ฌ ์ ํ (ํ๋ฉด ์ ํ)
์ฌ ๋ณ๊ฒฝ์ ๊ตฌํํด๋ณด์. ์ฌ ์ ํ์ ์ฌ ๊ด๋ฆฌ์๊ฐ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ์ง ์์๊น?
์ฌ ๋ณ๊ฒฝ ๋ํ ์ด์ ํ๋ ์๊ณผ ๋ค์ ํ๋ ์์ ์ฅ๋ฉด์ด ๋ค๋ฅด๊ธฐ์ ์ด๋ฒคํธ ๋ฐ์์ ํด์ ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ค.
์ผ๋จ ์๋ก์ด ์ฌ์ ํ๋ ๋ง๋ค์.
// Scene_Tool.h
#pragma once
#include "Scene.h"
class Scene_Start : public Scene {
public:
Scene_Start();
~Scene_Start();
virtual void Enter();
virtual void Exit();
};
// Scene_Tool.cpp
#include "pch.h"
#include "Scene_Tool.h"
#include "KeyManager.h"
Scene_Tool::Scene_Tool()
{
}
Scene_Tool::~Scene_Tool()
{
}
void Scene_Tool::Enter()
{
}
void Scene_Tool::Exit()
{
}
์ฐ๋ฆฌ๊ฐ ํ์ฌ ๋ง๋ค๊ณ ์๋ Scene_Start์์ Scene_Tool๋ก ๋์ด๊ฐ๋ ค๊ณ ๊ตฌํํ๋ค๊ณ ํ์ ๋ ์ฐ์ SceneManager์์ ์ฌ ๋ณ๊ฒฝ ํจ์๊ฐ ํ์ํ๋ค.
// 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);
Scene* GetCurScene() { return currScene; }
private:
void ChangeScene(SCENE_TYPE _next); // ์ถ๊ฐ
friend class EventManager; // ์น๊ตฌ ์ ์ธ
};
// SceneManager.cpp
void SceneManager::ChangeScene(SCENE_TYPE _next)
{
currScene->Exit();
currScene = arrScene[(UINT)_next];
currScene->Enter();
}
์ฌ ์ ํ ํจ์์์๋ ํด๋น ์ฌ์์ ๋์์ ๋ค์ ์ฌ์ ๋ค์ด๊ฐ ๋ ํด์ฃผ์ด์ผ ํ๋ ์ผ์ ํด์ผ ํ๋ค. ๋ฐ๋ผ์ ํ์ฌ ์ฌ์ ์ ๋ฆฌํ๋ ํจ์ Exit()์ ํธ์ถํ๊ณ ๊ทธ ๋ค๋ก ํ์ฌ ์ฌ์ ๋ค์ ์ฌ์ผ๋ก ์ง์ ํ ํ ๋ค์ ์ฌ์ ์ง์ ์ ์์ ํด์ฃผ์ด์ผ ํ๋ ํจ์ Enter()๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํจ์๋ฅผ Event Manager์์ ์ด๋ฒคํธ ํ์ ์ด SCENE_CHAGNE์ผ ๊ฒฝ์ฐ ํธ์ถํด์ฃผ๋ฉด ๋๋ค.
// Event Manager.cpp
void EventManager::Excute(const Event& _eve)
{
// ....
case EVENT_TYPE::SCENE_CHAGNE:
// lParam : Next Scene Type
SceneManager::Instance()->ChangeScene((SCENE_TYPE)_eve.lParam);
break;
// ....
}
์ํฐ๋ฅผ ๋๋ฅด๋ฉด ๋ค์ ์ฌ์ผ๋ก ๋์ด๊ฐ๋ค๊ณ ํ์์ ๋๋ฅผ ๊ตฌํํด๋ณด์
// Scene.h
virtual void update(); // ์์ - ๊ฐ์ํจ์๋ก
// Scene_Start.h
class Scene_Start : public Scene {
public:
Scene_Start();
~Scene_Start();
virtual void update(); // ์์ - ๊ฐ์ํจ์๋ก
virtual void Enter();
virtual void Exit();
};
// Scene_Start.cpp
void Scene_Start::update()
{
Scene::update();
// ์ถ๊ฐ์ ์ผ๋ก ํ๊ณ ์ ํ๋ ์ผ ์ถ๊ฐ
if (KEY_TAP(KEY::ENTER)) {
ChangeSceneEvent(SCENE_TYPE::TOOL);
}
}
// func.h
void ChangeSceneEvent(SCENE_TYPE _next);
// func.cpp
void ChangeSceneEvent(SCENE_TYPE _next)
{
Event evn = {};
evn.even = EVENT_TYPE::SCENE_CHAGNE;
evn.lParam = (DWORD_PTR)_next;
EventManager::Instance()->AddEvent(evn);
}
์ฌ ์ ๋ฐ์ดํธ ๋ถ๋ถ์ ๊ฐ์ ํจ์๋ก ๋ง๋ค์ด์ ์์ ํด๋์ค์์ ์ฌ์ ์ํ์ฌ ๊ธฐ์กด ์ฌ์์ ํด์ผ ํ๋ ์ผ์ ์ํํ๊ณ ๊ทธ ์ธ์ ์ถ๊ฐ์ ์ผ๋ก ํ๋ ค๋ ์ผ๋ ํ๋๋ก ํ๋ค. START ์ฌ์์ ์ํฐ๋ฅผ ๋๋ฅด๋ฉด ์ด๋ฒคํธ๋ฅผ ๋ฐ์ํ๋๋ก ํ๊ณ ๊ทธ ์ด๋ฒคํธ๋ func ํ์ผ์ ์๋ ํจ์๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ฌ๊ธฐ์ ์ฌ์ ์ ํํ ๋ ๋จ์ํ ์ฌ๋ง ์ ํํ ๊ฒ์ด ์๋๋ผ ์ฌ์ ๋์ฌ ๋ ํด๋น ์ฌ์์ ์ฌ์ฉํ๋ ์ค๋ธ์ ํธ๋ค์ ์ ๋ฆฌํด์ผ ํ๋ค. ์ฐ๋ฆฌ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ฒกํฐ๋ก ๊ตฌํํ๊ณ ์๋๋ฐ ๋จ์ ๋ฒกํฐ๋ง ํด๋ฆฌ์ด๊ฐ ํ๋ ๊ฒ์ด ์๋๋ผ ๊ทธ ์ธ๋ถ์ ์ธ ์ฃผ์ ๊ฐ๊ณผ ๋ฒกํฐ๋ ๋ ๋ ค์ฃผ์ด์ผ ํ๋ค. ์ด ๋ถ๋ถ์ ๊ณ์ ์์ฃผ ์ฌ์ฉํ ๋ถ๋ถ์ด๋ผ func ํ์ผ์ ํ ํ๋ฆฟ์ผ๋ก ๋ง๋ค์ด ๋์.
// func.h
// ์๋ณธ ๋ฒกํฐ๋ฅผ ๊ฐ์ ธ์์ผ ํจ์ผ๋ก ์ฐธ์กฐ
template<typename T>
void SafeDeleteVec(vector<T>& _vec)
{
for (size_t i = 0; i < _vec.size(); ++i) {
if (nullptr != _vec[i])
delete _vec[i];
}
_vec.clear();
}
// Scene.h
public:
void DeleteGroup(GROUP_TYPE type); // ํน์ ๊ทธ๋ฃน ์ค๋ธ์ ํธ ์ญ์
void DeleteAll(); // ๋ชจ๋ ์ค๋ธ์ ํธ ์ญ์
// Scene.cpp
void Scene::DeleteGroup(GROUP_TYPE type)
{
// SafeDeleteVec<Object*>(arrObj[(UINT)type]);
SafeDeleteVec(arrObj[(UINT)type]);
}
void Scene::DeleteAll()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
DeleteGroup((GROUP_TYPE)i);
}
}
// Scene_Start.cpp
void Scene_Start::Exit()
{
DeleteAll(); // ๋ชจ๋ ๋ฌผ์ฒด ์ญ์
ColliderManager::Instance()->Reset();
}
ํ ํ๋ฆฟ T๋ก ๋ฒกํฐ ํ์ ์ ์ ๋ฌ ๋ฐ๊ณ ์๊ธฐ์ Object* ๋ฅผ ๋ฃ์ด์ผ ํ์ง๋ง, ๋ฃ์ง ์๋๋ผ๋ ์ปดํ์ผ๋ฌ๊ฐ ์์์ ๋ฃ์ด์ค๋ค.
Enter๋ฅผ ๋๋ฅด๋ฉด Tool์ฌ์ผ๋ก ์ ํ๋๋ค.
์ค๋ธ์ ํธ๋ฅผ ๋ณต์ฌํด์ ๋ง๋ค๋ฉด ํ์ฌ ์ถฉ๋์ฒด์ ์ฃผ์๊ฐ ์๋์ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ถฉ๋ ๊ฐ์ ์ปดํฌ๋ํธ ๊ฐ์ฒด๋ค์ ๋ณต์ฌ์์ฑ์๋ฅผ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค.
// Object.cpp
Object::Object(const Object& _ori)
: strName(_ori.strName)
, vPos{_ori.vPos}
, vScale{_ori.vScale}
, collider(nullptr)
, act(true)
{
collider = new Collider(*_ori.collider);
collider->owner = this;
}
ํ๋ ์ด์ด, ๋ชฌ์คํฐ ๊ฐ์ ๊ฐ์ฒด๋ค์ ๋ณต์ฌํด๋ ๋ฌธ์ ๊ฐ ์์๊น? ํ์ฌ ๊ตฌํ๋ ๋ถ๋ถ์์ Texture*์ ๋์ผํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์์ผ๋ก ๋ฌธ์ ๊ฐ ์๋ค. ํ๋ ์ด์ด์ ๋ณต์ฌ์์ฑ์๋ ์์ฒ๋ผ ๊ตฌํ๋ ์ ์๋๋ฐ ๋ถ๋ชจ ํด๋์ค์ ๋ณต์ฌ์์ฑ์์ ์์ ์ ๋ณต์ฌ์์ฑ์ ๋ถ๋ถ(๋ฌธ์ ์์)์ด ์๊ธฐ์ ๊ตฌํํ์ง ์์๋ ๋๋ค.
์ด๋ ๊ฒ ์์ ํด๋์ค๊ฐ ์๊ธธ ๋๋ง๋ค ์ด๋ฐ ๋ถ๋ถ์ ๊ฐ๋ณ์ ์ผ๋ก ๊ณ ๋ คํด์ฃผ์ด์ผ ํ๋ค.
๋ง์ฝ ๊ธฐ์กด ํ๋ ์ด์ด๋ฅผ ๋ณต์ฌํด์ ํ ๋ง๋ฆฌ ๋ ๋ง๋ค์ด๋ณธ๋ค๊ณ ํ์.
// Start_Scene.cpp
void Scene_Start::Enter()
{
Object* obj = new Player;
obj->setPos(Vec2(640.f, 384.f));
obj->setScale(Vec2(100.f, 100.f));
AddObject(obj, GROUP_TYPE::PLAYER);
Object* otherPlayer = new Player(*(Player*)obj);
otherPlayer->setPos(Vec2(740.f, 384.f));
AddObject(otherPlayer, GROUP_TYPE::PLAYER);
// ...
}
ํ๋ ์ด์ด๊ฐ ๋ ๋ง๋ฆฌ ์์ฑ๋๋ค
๊ทผ๋ฐ ๋ณต์ฌ์์ฑ์ ํธ์ถํด์ ๋ง๋ค๋ ค๊ณ ํ๋ ๊ทธ ๊ณผ์ ์ด ์กฐ๊ธ ๋ถํธํ๋ค. ์ด๋ฅผ ํธํ๊ฒ ํ๊ธฐ ์ํด ๋ถ๋ชจ ์ค๋ธ์ ํธ์ ๊ฐ์ํจ์๋ก ์๊ธฐ ์์ ์ ๋ณต์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ Clone ํจ์ ํธ์ถํ์.
// Object.h
public:
virtual Object* Clone() = 0; // ์ถ๊ฐ
์ด๋ฌ๋ฉด ๋ชจ๋ ์ค๋ธ์ ํธ๋ค์ ์ด Clone ํจ์๋ฅผ ๊ตฌํํด์ผ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค. ๊ฐ๋ฐ์๋ ์ด ํจ์๋ฅผ ๊ตฌํํจ์ ์์ด ๊ธฐ์กด ๋ณต์ฌ ์์ฑ์๋ฅผ ์ด์ฉํด๋ ๋๋์ง, ์๋๋ฉด ์๋ก ๊ตฌํํด์ผ ๋๋์ง๋ ์๊ฐํ ์ ์๊ฒ ๋๋ค.
์ด ์น๊ตฌ๋ ๋งค ์์ ์ค๋ธ์ ํธ๋ง๋ค ๋ฐ๋ณต๋จ์ผ๋ก ๋งคํฌ๋ก๋ก ๋ง๋ค์ด ๋์.
// define.h
#define CLONE(type) type* Clone() { return new type(*this); }
์ด ์น๊ตฌ๋ฅผ ์ด์ฉํด ๊ธฐ์กด ์ฝ๋๋ ์์ ํด๋ณด๋๋ก ํ์.
// Player.h
class Texture;
class Player : public Object {
private:
Texture* tex;
void CreateMissile();
CLONE(Player); // ์ถ๊ฐ
public:
Player();
~Player();
virtual void update();
virtual void render(HDC _dc);
};
// Monster.h
public:
CLONE(Monster); // ์ถ๊ฐ
// Missile.h
public:
CLONE(Missile); // ์ถ๊ฐ
// Scene_Start.cpp ๋ณ๊ฒฝ
void Scene_Start::Enter()
{
Object* obj = new Player;
obj->setPos(Vec2(640.f, 384.f));
obj->setScale(Vec2(100.f, 100.f));
AddObject(obj, GROUP_TYPE::PLAYER);
Object* otherPlayer = obj->Clone(); // Clone ํจ์๋ฅผ ์ด์ฉํด ๋ง๋ฆ
otherPlayer->setPos(Vec2(740.f, 384.f));
AddObject(otherPlayer, GROUP_TYPE::PLAYER);
// ...
}
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 20] Tool (1) | 2024.06.11 |
---|---|
[winAPI 19] Unity Build (0) | 2024.06.11 |
[winAPI 15] Event Manager (1) | 2024.06.10 |
[winAPI 14] Collider(3) (1) | 2024.06.09 |
[winAPI 13] Collider(2) (1) | 2024.06.08 |