League Of Legends - Link Select [winAPI 15] Event Manager
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 15] Event Manager

by GAMEMING 2024. 6. 10.
728x90

 

 

์ €๋ฒˆ ์‹œ๊ฐ„์— ์„ค๋ช…ํ–ˆ๋“ฏ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  ์ด๋ฒคํŠธ ๊ด€๋ฆฌ์ž๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๊ทธ ์ „์— ์ €๋ฒˆ ์‹œ๊ฐ„์— 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