์ ๋ฒ ์๊ฐ์ ์ค๋ช ํ๋ฏ ์ด๋ฒ ํฌ์คํ ์์ ์ด๋ฒคํธ ๊ด๋ฆฌ์๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ๋ค.
๊ทธ ์ ์ ์ ๋ฒ ์๊ฐ์ Object์ ์ด๋ฆ ๋ณ์(strName)๋ฅผ ๋ฃ์ด์ฃผ์๋๋ฐ ๊ทธ์ ๊ด๋ จ๋ ์ธํฐํ์ด์ค ํจ์๋ฅผ ์์ฑํ๋๋ก ํ๋ค.
// Object.h
// ์ด๋ฆ ๊ด๋ จ ํจ์ ์ค์
void SetName(const wstring& _str) { strName = _str; }
const wstring& GetName() { return strName; }
๋ณธ๊ฒฉ์ ์ธ EventManager ํด๋์ค๋ฅผ ์์ฑํ๋๋ก ํ์. ์ผ๋จ ์ด๋ฒคํธ ํ์ ์๋ ์ด๋ค ๊ฒ์ด ์์๊น? ์ด๋ฒคํธ๋ ์ด๋ ํ ์ฝ๋ ๊ธฐ์ ์ผ๋ก ์ด์ ํ๋ ์์๋ ์์๋๋ฐ ๋ค์ ํ๋ ์์๋ ์๊ธฐ๋ ๊ฒฝ์ฐ๋ฅผ ์๋ฏธํ๋ค. ์ฐ๋ฆฌ์ ํ๋ก๊ทธ๋จ์์ ๋ฏธ์ฌ์ผ ์์ฑ์ด ํด๋นํ๋ค. (์ด์ ํ๋ ์์๋ ์์๋๋ฐ ๋ค์ ํ๋ ์์๋ ์๊ฒจ์ผ ํจ)
์ด๋ฒคํธ ํ์ ์ ์ ์ํ๋๋ก ํ์. ์ฐ์ ํฌ๊ฒ 3๊ฐ์ง ๊ฒฝ์ฐ๋ก ์ค๋ธ์ ํธ ์์ฑ, ์ค๋ธ์ ํธ ์ญ์ , ํ๋ฉด ์ ํ์ด ์๋ค.
// define.h
enum class EVENT_TYPE {
CREATE_OBJECT,
DELETE_OBJECT,
SCENE_CHAGNE,
END,
};
์ถํ ์ด๋ฒคํธ ๊ด๋ฆฌ์๋ ์ถฉ๋๊ณผ์ ์ฐ๊ณ๋ ํ์ํ๊ฒ ๋ ์์ ์ธ๋ฐ, ์ถฉ๋ํ๋๋ฐ ๋ ๋ฌผ์ฒด ์ค ํ๋๊ฐ ์์ด์ง ์ํฉ์์ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. exitํ์ง ๋ชปํ ์ฑ๋ก ์ฃฝ์ ์ค๋ธ์ ํธ๋ col์ด 0๋ณด๋ค ํฌ๊ฒ ๋จ์ ๋จ์ ๋ฌผ์ฒด์ ์ถฉ๋๋ฐ์ค๊ฐ ๊ณ์ ๋ ๋(์ถฉ๋ ๋ ์ํ)๋ก ํ์๋๋ ์ค๋ฅ๋ฅผ ๋ฒํ๋ค.
๋ฌดํผ ์ด๋ฒคํธ ํด๋์ค๋ฅผ ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
// EventManager.h
#pragma once
struct Event{
EVENT_TYPE even;
DWORD_PTR lParam;
DWORD_PTR wParam;
};
class EventManager {
SINGLE(EventManager)
private:
vector<Event> vecEvent;
void Excute(const Event& _eve);
public:
void update();
void AddEvent(const Event& _eve) { vecEvent.push_back(_eve); }
};
// EventManager.cpp
#include "pch.h"
#include "EventManager.h"
#include "Object.h"
#include "SceneManager.h"
#include "Scene.h"
EventManager::EventManager()
{
}
EventManager::~EventManager()
{
}
void EventManager::Excute(const Event& _eve)
{
switch (_eve.even)
{
case EVENT_TYPE::CREATE_OBJECT:
{
// lParam : Object Adress
// wParam : Group Type
Object* newObj = (Object*)_eve.lParam;
GROUP_TYPE type = (GROUP_TYPE)_eve.wParam;
SceneManager::Instance()->GetCurScene()->AddObject(newObj, type);
}
break;
case EVENT_TYPE::DELETE_OBJECT:
break;
case EVENT_TYPE::SCENE_CHAGNE:
break;
default:
break;
}
}
void EventManager::update()
{
// ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌ
for (size_t i = 0; i < vecEvent.size(); ++i) {
Excute(vecEvent[i]);
}
vecEvent.clear(); // ์ฒ๋ฆฌ ๋๋ ์ด๋ฒคํธ๋ ์ญ์
}
// Player.cpp
void Player::CreateMissile()
{
// ....
// ํ์ฌ์ฌ์์ ๋ฐ๋ก ์ถ๊ฐํ์ง ์๊ณ (๊ธฐ์กด ์ฝ๋์ญ์ ) ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ๊ฒ -> ํจ์ ํธ์ถ
CreateObject(missile,GROUP_TYPE::PROJ_PALYER);
}
// func.h - ์์ฃผ ์ฌ์ฉํ๋ ํจ์๋ฅผ ์ฌ๊ธฐ์ ์์ฑํ๋๋ก ํ๋ค.
// ์ด ์น๊ตฌ๋ pch.h์ ์ฐธ์กฐํ๋๋ก ํจ
class Object;
void CreateObject(Object* _obj, GROUP_TYPE _group);
// func.cpp
#include "pch.h"
#include "func.h"
#include "EventManager.h"
void CreateObject(Object* _obj, GROUP_TYPE _group)
{
Event evn = {};
evn.even = EVENT_TYPE::CREATE_OBJECT;
evn.lParam = (DWORD_PTR)_obj;
evn.wParam = (DWORD_PTR)_group;
EventManager::Instance()->AddEvent(evn);
}
์ด๋ฒคํธ๋ ํ์ฌ ํ๋ ์์ด ๋ค ๊ทธ๋ ค์ง๊ณ ๋ค์ ํ๋ ์์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์์ผ๋ก Core ํด๋์ค์์ ๋งจ ๋ง์ง๋ง์ update ์์ผ์ฃผ์ด์ผ ํ๋ค.
// Core.cpp
void Core::Progress()
{
// Manager update
TimeManager::Instance()->update();
KeyManager::Instance()->update();
SceneManager::Instance()->update();
ColliderManager::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);
// TimeManager::Instance()->render();
// ์ด๋ฒคํธ ์ง์ฐ์ฒ๋ฆฌ (๋งจ ๋ง์ง๋ง์ ์ํํด์ ๋ค์ ํ๋ ์์ ๋ฐ์๋์ด์ผ ํจ)
EventManager::Instance()->update();
}
updateํจ์์์ ํด๋น ํ๋ ์์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ฅผ ๋ชจ์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค. ์ฒ๋ฆฌ๋ ์ด๋ฒคํธ์ ๊ฒฝ์ฐ ๋ฒกํฐ์์ ์ญ์ ์์ผ์ฃผ์.
Excuteํจ์๋ ์ด๋ฒคํธ ์ข ๋ฅ์ ๋ฐ๋ผ์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
์ค๋ธ์ ํธ ์์ฑ์์์ Event ๊ตฌ์กฐ์ฒด์ ๊ฐ ๋ณ์๋ค์ ์ด๋ฒคํธ ํ์ ๊ณผ ์ค๋ธ์ ํธ ์ฃผ์, ์ค๋ธ์ ํธ ๊ทธ๋ฃน ํ์ ์ ์๋ฏธํ๋ค. ์ด๋ ์ฌ๋ฌ ์ํฉ์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํ ์ ์๋๋ก DWORD_PTR์ ์ฌ์ฉํ๋ค.
์ค๋ธ์ ํธ ์์ฑ ์์ ๊ฐ ์ค๋ธ์ ํธ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ํ์ฌ ์ฌ์ ์ค๋ธ์ ํธ๋ฅผ ์ถ๊ฐํ๋๋ก ํ๋ค.
์ค๋ธ์ ํธ ์ญ์ ์ ์กฐ๊ธ ์ด๋ ต๊ฒ ๋์ํ๋ค. ์์ฑ ๋๋ '์ ๋ฐ์ดํธ → ๋ ๋(๊ทธ๋ฆฌ๊ธฐ) → ๋ค์ ํ๋ ์ ๋ฐ์' ์ด๋ ๊ฒ ์๋ํ์์ง๋ง, ์ญ์ ํ ๋๋ ๋ค์ ํ๋ ์ ๋ฐ์ ๋จ๊ณ์์ ์ค๋ธ์ ํธ๊ฐ ์ญ์ ๋์๋ค๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง๋ง, ๋ค์ ํ๋ ์์์ ๊ทธ๋ฅผ ๋ฐ์ํ๊ณ ๊ทธ๋ฆฌ๋ ๋จ๊ณ(์ ๋ฐ์ดํธ, ๋ ๋)์์๋ ์ด ์ค๋ธ์ ํธ์ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ ๊ทผ(์ฐธ์กฐ)ํ๋ ค ์๋ ์ ๋ค์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ญ์ ์ด๋ฒคํธ๊ฐ ๋ฑ๋ก๋๋ฉด ์ค๋ธ์ ํธ๋ฅผ ์ญ์ ํ๋ค๋ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ์ํด์ผ ํ๋ค. ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋ฐ์ํ์ฌ ๋ค์ ํ๋ ์ ์ ๋ค์๊ฒ ์ด ์น๊ตฌ๊ฐ ๊ณง ์ญ์ ๋จ์ ์๋ฆฌ๊ณ (Dead ์ํ - ์ฃฝ์ ์ค๋ธ์ ํธ์ด๋ ์์ ํ ์ญ์ ๋์ง ์์ ์ํ) ์ด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ์ ๋ค์ด ์ค๋นํ ์ ์๊ฒ ํ๊ณ (์ฐธ์กฐํ ๊ฒ๋ค ์ ๋ฆฌ) ๊ทธ ๋ค์ ํ๋ ์(2ํ๋ ์ ๋ค)์์ ์ญ์ ๋์ด ์์ด์ง๊ฒ ๊ตฌํํด์ผ ํ๋ค.
→ ์ญ์ ์์ ๋ ์ด๋ฒคํธ๋ฅผ ๋ชจ์ ๊ฒ์ด ํ์ํ๋ค = vecDead
// EventManager.h
lass EventManager {
SINGLE(EventManager)
private:
vector<Event> vecEvent;
vector<Object*> vecDead; // ์ถ๊ฐ
void Excute(const Event& _eve);
public:
void update();
void AddEvent(const Event& _eve) { vecEvent.push_back(_eve); }
};
// EventManager.cpp
void EventManager::Excute(const Event& _eve)
{
switch (_eve.even)
{
case EVENT_TYPE::CREATE_OBJECT:
{
// lParam : Object Adress
// wParam : Group Type
Object* newObj = (Object*)_eve.lParam;
GROUP_TYPE type = (GROUP_TYPE)_eve.wParam;
SceneManager::Instance()->GetCurScene()->AddObject(newObj, type);
}
break;
case EVENT_TYPE::DELETE_OBJECT:
{
// lParam : Object Adress
// wParam : Group Type
Object* deadObj = (Object*)_eve.lParam;
deadObj->SetDead();
vecDead.push_back(deadObj);
}
break;
case EVENT_TYPE::SCENE_CHAGNE:
break;
default:
break;
}
}
void EventManager::update()
{
// ์ด์ ํ๋ ์์ ์์๋ ์ ๋ค ์ฒ๋ฆฌz
for (size_t i = 0; i < vecDead.size(); ++i) {
delete vecDead[i];
}
vecDead.clear();
// ์ด๋ฒคํธ ์ฒ๋ฆฌ
for (size_t i = 0; i < vecEvent.size(); ++i) {
Excute(vecEvent[i]);
}
vecEvent.clear(); // ์ฒ๋ฆฌ ๋๋ ์ด๋ฒคํธ๋ ์ญ์
}
์ค๋ธ์ ํธ๋ฅผ ์ญ์ ํ๋ ์ด๋ฒคํธ์์๋ Object๋ฅผ Dead ์ํ๋ก ๋ณ๊ฒฝํ๊ณ ์ญ์ ์์ ์ค๋ธ์ ํธ๋ฅผ ๋ชจ์๋๋ ์ผ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ฐ์ดํธ ํจ์ ๋ด์์ ํ์ฌ ํ๋ ์์ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ์ด์ ํ๋ ์์ ์์ ๋จ๋ ์ ๋ค์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํ์ํ๋ค.
์ค๋ธ์ ํธ๋ฅผ Dead์ํ๋ก ๋ณ๊ฒฝํ๊ธฐ
// Object.h
#pragma once
class Collider;
class Object {
private:
wstring strName;
Vec2 vPos;
Vec2 vScale;
Collider* collider;
bool act; // ์ถ๊ฐ : ํ์ฑํ ์ํ
public:
Object();
virtual ~Object();
void setPos(Vec2 _vPos) { vPos = _vPos; }
void setScale(Vec2 _vScale) { vScale = _vScale; }
Vec2 getPos() { return vPos; }
Vec2 getScale() { return vScale; }
void SetName(const wstring& _str) { strName = _str; }
const wstring& GetName() { return strName; }
bool IsDead() { return !act; } // ์ถ๊ฐ
Collider* GetCollider() { return collider; }
void CreateCollider();
virtual void OnCollision(Collider* _other) {}
virtual void OnCollisionEnter(Collider* _other) {}
virtual void OnCollisionExit(Collider* _other) {}
public:
virtual void update() = 0;
virtual void render(HDC _hdc);
virtual void finalUpdate() final;
void commponentRender(HDC _hdc);
void SetDead() { act = false; } // ์ถ๊ฐ. ๋ฌด์กฐ๊ฑด ์ด๋ฒคํธ ํด๋์ค๋ง ์ฌ์ฉ๊ฐ๋ฅ
friend class EvenManager; // ์ถ๊ฐ
};
์ค๋ธ์ ํธ ๋ด์ ์ด ์ค๋ธ์ ํธ๊ฐ ํ์ฑํ๋์ด ์๋์ง๋ฅผ ์ ์ ์๋ ๋ณ์(act)๋ฅผ ๋ง๋ค๊ณ ๊ด๋ จ ์ธํฐํ์ด์ค ํจ์๋ฅผ ์์ฑํ๋ค. ์ด๋ ์ฃฝ์๋์ง ์๋ ค์ฃผ๋ ํจ์ IsDead()์ act๋ฅผ ์ค์ ํ๋ SetDead()๋ฅผ ๋ง๋ ๋ค. ํ์ง๋ง ๋ชจ๋ ์ค๋ธ์ ํธ๊ฐ ์๊ธฐ ์์ ์ด ์ฃฝ์๋์ง ์ด์๋์ง๋ฅผ ์ ํ์ง ์๊ณ ๋ฌด์กฐ๊ฑด ์ด๋ฒคํธ ๊ด๋ฆฌ์๋ง ์ค์ ํ๋๋ก private์ผ๋ก ์ค์ ํ๊ณ ์ด๋ฒคํธ ๊ด๋ฆฌ์๋ฅผ ์น๊ตฌ๋ก ํด์ฃผ๋ฉด ๋๋ค.
// Scene.cpp
void Scene::update()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
for (size_t j = 0; j < arrObj[i].size(); ++j) {
if (!arrObj[i][j]->IsDead()) {
arrObj[i][j]->update(); // NO update
}
}
}
}
void Scene::finalUpdate()
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
for (size_t j = 0; j < arrObj[i].size(); ++j) {
arrObj[i][j]->finalUpdate();
// ์ญ์ ๋๋ ์ ๋ค์ด ์ถฉ๋์ด ๊ณ์ ๋์ด์ผ ํ๊ธฐ์ ํด์ผํจ
}
}
}
void Scene::render(HDC _hdc)
{
for (UINT i = 0; i < (UINT)GROUP_TYPE::END; ++i) {
vector<Object*>::iterator iter = arrObj[i].begin();
for (; iter != arrObj[i].end();) {
if (!(*iter)->IsDead()) {
(*iter)->render(_hdc);
++iter;
}
else // ์ญ์ ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ
{
iter = arrObj[i].erase(iter);
}
}
}
}
์ค๋ธ์ ํธ์ ํ์ฑ ์ฌ๋ถ์ ๋ฐ๋ผ update์ renderํด์ฃผ์ด์ผ ํ๋ค. ๋จ finalUpdate๋ ์ญ์ ๋๋ ์ค๋ธ์ ํธ์ ์ถฉ๋์ฒด ์ํ๊ฐ ๊ณ์ update๋์ด์ผ ํ๊ธฐ์ ๋ณ๊ฒฝํ์ง ์์์ผ ํ๋ค.
๋ชฌ์คํฐ๊ฐ ๋ฏธ์ฌ์ผ์ ๋ง์ผ๋ฉด ์์ด์ง๋๋ก ํด๋ณด์.
// Player.cpp
void Player::CreateMissile()
{
Vec2 missilePos = getPos();
missilePos.y -= getScale().y / 2.f;
Missile* missile = new Missile;
missile->SetName(L"Missile_player");
missile->setPos(missilePos);
missile->setScale(Vec2(25.f, 25.f));
missile->SetDir(Vec2(0.f, -1.f));
// ํ์ฌ์ฌ์์ ๋ฐ๋ก ์ถ๊ฐํ์ง ์๊ณ ์ด๋ฒคํธ๋ฅผ ์์ฑํ๋ ๊ฒ -> ํจ์ ํธ์ถ
CreateObject(missile,GROUP_TYPE::PROJ_PALYER);
}
// Monster.cpp
void Monster::OnCollisionEnter(Collider* _other)
{
Object* otherObj = _other->GetObj();
if (otherObj->GetName() == L"Missile_player") {
DeleteObject(this);
}
}
// TimeManager.cpp
void TimeManager::update()
{
QueryPerformanceCounter(&curCount);
dDT = (double)(curCount.QuadPart - prevCount.QuadPart) / (double)prequency.QuadPart;
prevCount = curCount;
#ifdef _DEBUG
// ๋๋ฒ๊ทธ ๋ชจ๋์์ ์ค๋จ์ ์ค๋ ๊ฑธ์ด๋๋ฉด
// ์๊ฐ์ด ๋ง๋ ์๋๊ฒ ์ปค์ง ์ ์์
if (dDT > (1. / 60.))
dDT = (1. / 60.);
#endif
}
์, ๋ง์ฝ์ ์ถฉ๋ํ๋๋ฐ ๋ชฌ์คํฐ๊ฐ ํ ๋ฒ์ ์ฃฝ์ง ์๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ ์ ์๋ค. ์ด๋ ๋ฏธ์ฌ์ผ์ด๋ ์ถฉ๋ํ๋ค๊ณ ํ๋ฉด ๋ชฌ์คํฐ์ ์ถฉ๋ ์นด์ดํฐ๋ 1์ด์์ผ๋ก ์ฒดํฌ๋ฐ์ค๊ฐ ๋ ๋(์ถฉ๋ํ์) ๋จ์ ์๋ ์๋ค. ์๋์ ์ฝ๋ ์ฐธ๊ณ .
// Scene_start.cpp
void Scene_Start::Enter()
{
// ...
for (int i = 0; i < monCount; ++i) {
// ...
monsterObj->SetName(L"Monster");
// ...
}
// ...
ColliderManager::Instance()->CheckGroup(GROUP_TYPE::MONSTER, GROUP_TYPE::PROJ_PALYER);
}
// Missile.cpp
Missile::Missile()
: theta(PI/4.f)
, dir(Vec2(1.f, 1.f))
{
dir.Normalize();
CreateCollider();
GetCollider()->SetScale(Vec2(15.f, 15.f)); // ํฌ๊ธฐ ์ค์
}
void Missile::OnCollisionEnter(Collider* _other)
{
Object* other = _other->GetObj();
if (other->GetName() == L"Monster") {
DeleteObject(this);
}
}
์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ถฉ๋ ์ญ์ ์ ๋ํด ์๊ธธ ์ ์๋ ์ํฉ์ ์ถฉ๋ ๊ทธ๋ฃน์ ์ ๋ฐ์ดํธ ๋ถ๋ถ์์ ๊ณ ๋ คํด ์ฃผ์ด์ผ ํ๋ค.
// ColliderManager.cpp
void ColliderManager::CollisionUpdateGroup(GROUP_TYPE _left, GROUP_TYPE _right)
{
// ...
if (IsCollision(leftCol, rightCol)) {
// ํ์ฌ ์ถฉ๋ ์ค์ด๋ค
if (iter->second) {
// ์ด์ ์๋ ์ถฉ๋ํ๊ณ ์์๋ค - ์ถฉ๋ ์ค
if (vecLeft[i]->IsDead() || vecRight[j]->IsDead()) {
// ๊ทผ๋ฐ ๋ ์ค ํ๋๊ฐ ์ญ์ ์์ ์ด๋ผ๋ฉด,
// ์ถฉ๋ ํด์ ํ๋ค.
leftCol->OnCollisionExit(rightCol);
rightCol->OnCollisionExit(leftCol);
iter->second - false;
}
else {
leftCol->OnCollision(rightCol);
rightCol->OnCollision(leftCol);
}
}
else {
// ์ด์ ์๋ ์ถฉ๋ํ์ง ์์๋ค - ๋ง ์ถฉ๋ํจ
if (!vecLeft[i]->IsDead() || vecRight[j]->IsDead()) {
// ๊ทผ๋ฐ ๋ ์ค ํ๋๊ฐ ์ญ์ ์์ ์ด๋ผ๋ฉด,
// = ์ถฉ๋ํ๋ ค๋ ์๊ฐ ์ญ์ ๋ ๊ฒ ๊ฐ์
// ์ถฉ๋ ํ์ง ์์ ๊ฒ์ผ๋ก ์ทจ๊ธ
leftCol->OnCollisionEnter(rightCol);
rightCol->OnCollisionEnter(leftCol);
iter->second = true;
}
}
}
else { // ํ์ฌ ์ถฉ๋ํ๊ณ ์์ง ์๋ค.
if (iter->second) {
// ์ด์ ์๋ ์ถฉ๋ํ๊ณ ์์๋ค - ์ถฉ๋์์ ๋ ๋๊ฒ.
leftCol->OnCollisionExit(rightCol);
rightCol->OnCollisionExit(leftCol);
iter->second = false;
}
}
// ...
}
๋ชฌ์คํฐ์ ํน์ hp๋ฅผ ๊ฑธ๊ณ ๋ฏธ์ฌ์ผ์ ๋ฟ์ ๋๋ง๋ค ํผ 1์ ๊น์๋ณด๋๋ก ํ์.
// Monster.cpp
void Monster::OnCollisionEnter(Collider* _other)
{
Object* otherObj = _other->GetObj();
if (otherObj->GetName() == L"Missile_player") {
hp -= 1;
if(hp <= 0)
DeleteObject(this);
}
}
5๋ ๋๋ฆฌ๋ฉด ๋ชฌ์คํฐ๊ฐ ์ฃฝ์ด ์์ด์ง๋ค.
[ ์ฝ๋ ]
https://github.com/MiyeongEom/GameBasic/commit/ee48314c5fa33a9965351a064fe3a05e843e4f2b
~ EventManager · MiyeongEom/GameBasic@ee48314
MiyeongEom committed Jun 9, 2024
github.com
'๐ค Study > winAPI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[winAPI 19] Unity Build (0) | 2024.06.11 |
---|---|
[winAPI 16] Scene & Object (1) | 2024.06.10 |
[winAPI 14] Collider(3) (1) | 2024.06.09 |
[winAPI 13] Collider(2) (1) | 2024.06.08 |
[winAPI 12] Collider(1) (0) | 2024.06.06 |