🧐 Study/winAPI

[winAPI 15] Event Manager

GAMEMING 2024. 6. 10. 04:00

 

 

μ €λ²ˆ μ‹œκ°„μ— μ„€λͺ…ν–ˆλ“― 이번 ν¬μŠ€νŒ…μ—μ„  이벀트 κ΄€λ¦¬μžλ₯Ό λ§Œλ“€μ–΄λ³΄λ„λ‘ ν•˜κ² λ‹€.

κ·Έ 전에 μ €λ²ˆ μ‹œκ°„μ— 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

 

728x90