League Of Legends - Link Select [winAPI 13] Collider(2)
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/winAPI

[winAPI 13] Collider(2)

by GAMEMING 2024. 6. 8.
728x90

 

 

๊ฐค๋Ÿฌ๊ทธ ๊ฐ™์€ ๊ฒŒ์ž„์—์„œ์˜ ํ”Œ๋ ˆ์ด์–ด ์ถฉ๋Œ ๋ฐ•์Šค๋Š” ๋ณดํ†ต ์•ˆ์ชฝ์œผ๋กœ ๋˜์–ด, ๋ฏธ์‚ฌ์ผ์ด ๋‚ ๋ผ์™€๋„ ํ”ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ์‚ฌ์ง„๊ฐ™์ด ์ˆ˜์ •ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ถ”๊ฐ€๋กœ ๋ชฌ์Šคํ„ฐ์—๋„ ์ถฉ๋Œ ๋ฐ•์Šค๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

 

 

// Player.cpp ์ˆ˜์ •
Player::Player()
	: tex(nullptr)
{
	// Texture Loading
	tex = ResManager::Instance()->LoadTexture(L"PlayerTex", L"Texture\\Player.bmp");

	CreateCollider();	// ์ถฉ๋Œ ํ•„์š”ํ•œ ์• ๋“ค ๋‹ค ๋„ฃ์–ด์ฃผ๊ธฐ.
	GetCollider()->SetOffsetPos(Vec2(0.f, 10.f));	// ์ˆ˜์ •
	GetCollider()->SetScale(Vec2(40.f, 50.f));		// ์ˆ˜์ •
}


// Monster.cpp
Monster::Monster()
	: speed(100.f)
	, centerPos(Vec2(0.f, 0.f))
	, maxDis(50.f)		
	, dir(1)
{
	CreateCollider();
	GetCollider()->SetScale(Vec2(42.f, 42.f));	// ์ถ”๊ฐ€
}

 

 

์ถฉ๋Œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ๋•Œ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด์„œ ๋ชจ๋“  ์กฐํ•ฉ์„ ์ง„ํ–‰ํ•˜๋ฉด ๋„ˆ๋ฌด ๋งŽ์€ ์ถฉ๋Œ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ถฉ๋Œ ์ฒ˜๋ฆฌ ํ•  ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ฃน๋ผ๋ฆฌ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•ด์•ผ ํ•˜๊ธฐ์— ์šฐ์„  ์ถฉ๋Œ ์ฒ˜๋ฆฌ ํ•  ์˜ค๋ธŒ์ ํŠธ ์ง€์ •์„ ํ•ด์ฃผ๋„๋ก ํ•˜์ž.

 

์”ฌ๋งˆ๋‹ค ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ฃน์„ ์ง€์ •ํ•ด์•ผ ํ•˜๊ณ , ๊ทธ ์”ฌ์ด ๋๋‚˜์„œ ์ „ํ™˜ํ•  ๋•Œ๋Š” ์ง€์ •๋œ ์ถฉ๋Œ ๊ทธ๋ฃน์„ ํ•ด์ œํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

 

์ถฉ๋Œ ๊ทธ๋ฃน์€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ๊นŒ? ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ตœ๋Œ€ 32๊ฐœ์˜ ํƒ€์ž…์„ ๊ฐ€์ง€๋„๋ก ์„ค๊ณ„ํ•˜์˜€๋‹ค. PLAYER(1)๊ณผ MONSTER(3)์„ ์ถฉ๋Œ์‹œํ‚จ๋‹ค๋ฉด ์šฐ์„  ์˜ค๋ธŒ์ ํŠธ ํƒ€์ž… ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด ํ”Œ๋ ˆ์ด์–ด ๊ฐ์ฒด์™€ ๋ชฌ์Šคํ„ฐ ๊ฐ์ฒด์˜ ์ถฉ๋Œ์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋œ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋ผ๋ฆฌ ์ถฉ๋Œ์ด ์—†์œผ๋ฉด 0, ์žˆ์œผ๋ฉด 1.

 

32๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ์ž„์œผ๋กœ 32bit, 8๋น„ํŠธ๋Š” 1๋ฐ”์ดํŠธ์ž„์œผ๋กœ 4๋ฐ”์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ์ด ๋ฐ”์ดํŠธ๊ฐ€ 32๊ฐœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•ด๋‹นํ•˜๋Š” ๋ฐฐ์—ด์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

๊ฒ€์‚ฌ ์‹œ์ ์€ DT๋ผ๋Š” ์‹œ๊ฐ„๋™์•ˆ ์ง„ํ–‰๋œ update, finalUpdate ์ดํ›„ ์ถฉ๋Œ์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ฒดํฌํ•˜๋„๋ก ํ•˜๊ณ  ๊ทธ ํ›„ ๋žœ๋”๋งํ•˜๋„๋ก ํ•œ๋‹ค. updateํ•จ์ˆ˜๋Š” ๋ชจ๋“  ๊ทธ๋ฃน ๊ฐ„์˜ ์ถฉ๋Œ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.

 

 


 

 

CollisionUpdateGroup ํ•จ์ˆ˜ : ๋‘ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ฃน ๊ฐ„์˜ ์ถฉ๋Œ์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ•จ์ˆ˜๋กœ ํ˜„์žฌ ์”ฌ(currScene)์„ ๊ฐ€์ ธ์™€ ๊ฐ ๊ทธ๋ฃน์— ์†ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ฒกํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋•Œ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ์ ์€ ์•„๋ž˜์˜ ์‚ฌ์ง„์—์„œ

 

์˜ค๋ฅธ์ชฝ์ด ๋ฐ˜ํ™˜๋œ ์ฐธ์กฐ๋œ ๊ฐ’์ด์ง€ ์™ผ์ชฝ์€ ๋‹จ์ˆœ ์ง€์—ญ๋ณ€์ˆ˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ์›๋ณธ์„ ์ฐธ์กฐ ๋ฐ›์„ ๋•Œ๋Š” ๋ฐ˜ํ™˜ ํƒ€์ž… ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ทธ๊ฒƒ์„ ๋ฐ›์„ ๋ณ€์ˆ˜๋„ const &์—ฌ์•ผ ํ•œ๋‹ค. ์ด๋ž˜์•ผ ์ œ๋Œ€๋กœ ์ฐธ์กฐ๋œ ๊ฒƒ. ๋ฒกํ„ฐ ํฌ๊ธฐ๋งŒํผ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉฐ ๊ฐ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ถฉ๋Œ์ฒด๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ถฉ๋Œ์ฒด ๊ฐ„์˜ ์ถฉ๋Œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค.

 

 

IsCollision ํ•จ์ˆ˜๋Š” ๋‘ ์ถฉ๋Œ์ฒด ๊ฐ„์˜ ์ถฉ๋Œ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋‹ค์Œ ์‹œ๊ฐ„์— ์ž์„ธํžˆ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.

 

 

 

CheckGroup ํ•จ์ˆ˜๋Š” ํŠน์ • ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ฃน ์Œ์— ๋Œ€ํ•œ ์ถฉ๋Œ ํ™œ์„ฑํ™”(0/1) ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•œ๋‹ค. ์ถฉ๋Œํ•˜๋Š” ์Œ์ด๋ฉด 1, ์•„๋‹ˆ๋ฉด 0์„ ๋น„ํŠธ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ฃ๋Š”๋‹ค. ๊ฐ _left์™€ _right๋ฅผ ์ •์ˆ˜ํ˜•์œผ๋กœ row์™€ col์— ์ €์žฅํ•˜๋Š”๋ฐ ์ด๋•Œ row๊ฐ€ ํ•ญ์ƒ ํฐ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ์กฐ์ •ํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์˜ ๋ฐฐ์—ด์—์„œ ์ค‘๋ณต๋œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ์• ๋“ค(๋นจ๊ฐ„์ƒ‰ ํŽœ, ์ฃผํ™œ์ƒ‰ ํŽœ)์ด ์žˆ์–ด ๋Œ€๊ฐ์„ ์„ ๊ธฐ์ค€์œผ๋กœ ๋Œ€์นญ์„ฑ์ด ์ƒ๊ธด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ œ์™ธํ•œ ์ ˆ๋ฐ˜์˜ ๋ฐฐ์—ด๋งŒ์„ ์‚ฌ์šฉํ•  ํ•„์š”(ํ˜•๊ด‘ํŽœ)๊ฐ€ ์žˆ๋‹ค. (+๋น„ํŠธ๋Š” ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์‚ฝ์ž…..)

 

๊ทธ๋ ‡๊ธฐ์— row๊ฐ€ ํ•ญ์ƒ ๋” ํฐ ๊ฐ’์„ ๊ฐ€์ง€๋„๋ก ์„ค์ •ํ•˜์—ฌ ๋Œ€๊ฐ์„  ์ƒ๋‹จ์˜ ์‚ผ๊ฐํ˜• ๋ถ€๋ถ„๋งŒ ๊ฒ€์‚ฌํ•˜๋ฉด, ์ค‘๋ณต๋œ ๊ฒ€์‚ฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

// Scene_start.cpp
#include "ColliderManager.h"

void Scene_Start::Enter()
{
	// ...
    ColliderManager::Instance()->CheckGroup(GROUP_TYPE::PLAYER, GROUP_TYPE::MONSTER);
}

void Scene_Start::Exit()
{
	ColliderManager::Instance()->Reset();
}


// ColliderManager.h
class Collider;

class ColliderManager {
	SINGLE(ColliderManager);
private:
	UINT arrCheck[(UINT)GROUP_TYPE::END];

	void CollisionUpdateGroup(GROUP_TYPE _left, GROUP_TYPE _right);
	bool IsCollision(Collider* _leftCol, Collider* _rightCol);

public:
	void update();
	void CheckGroup(GROUP_TYPE _left, GROUP_TYPE _right);
	void Reset() { memset(arrCheck, 0, sizeof(UINT) * (UINT)GROUP_TYPE::END); }  // 4๋ฐ”์ดํŠธ
};



// ColliderManger.cpp
#include "pch.h"
#include "ColliderManager.h"

#include "SceneManager.h"
#include "Scene.h"
#include "Object.h"
#include "Core.h"

ColliderManager::ColliderManager()
{

}

ColliderManager::~ColliderManager()
{

}

void ColliderManager::CollisionUpdateGroup(GROUP_TYPE _left, GROUP_TYPE _right)
{
	Scene* currScene = SceneManager::Instance()->GetCurScene();
	const vector<Object*>& vecLeft = currScene->GetGroupObject(_left);	
	const vector<Object*>& vecRight = currScene->GetGroupObject(_right);

	for (size_t i = 0; i < vecLeft.size(); ++i) {
		if (nullptr == vecLeft[i]->GetCollider())	
			continue;
		for (size_t j = 0; j < vecRight.size(); ++j) {
			if (nullptr == vecRight[j]->GetCollider()
				|| (vecLeft[i] == vecRight[j]))
				continue;
			
			// ์ถฉ๋Œ์ฒ˜๋ฆฌ
			if (IsCollision(vecLeft[i]->GetCollider(), vecRight[j]->GetCollider())) {

			}

			else
				;
		}
	}
}

bool ColliderManager::IsCollision(Collider* _leftCol, Collider* _rightCol)
{
	return false;
}

void ColliderManager::update()
{
	// ์ถฉ๋Œ๊ฒ€์‚ฌ
	for (UINT iRow = 0; iRow < (UINT)GROUP_TYPE::END; ++iRow) {
		for (UINT iCol = iRow; iCol < (UINT)GROUP_TYPE::END; ++iCol)
			if (arrCheck[iRow] & (1 << iCol))
				CollisionUpdateGroup((GROUP_TYPE)iRow, (GROUP_TYPE)iCol); 
	}
}

void ColliderManager::CheckGroup(GROUP_TYPE _left, GROUP_TYPE _right)
{
	UINT row = (UINT)_left;
	UINT col = (UINT)_right;

	if (col < row) {
		row = (UINT)_right;
		col = (UINT)_left;
	}

	if (arrCheck[row] & (1 << col))		
		arrCheck[row] &= ~(1 << col);	
	else
		arrCheck[row] |= (1 << col);
}


// Scene.h
// public์— ์ถ”๊ฐ€
	const vector<Object*>& GetGroupObject(GROUP_TYPE _type) // ์›๋ณธ์„ ์ฐธ์กฐํ•˜์—ฌ์•ผ ํ•˜๊ธฐ์— const &
	{
		return  arrObj[(UINT)_type];
	}

 

 


 

์ถฉ๋Œ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•˜์˜€๋Š”๋ฐ ์šฐ๋ฆฌ๋Š” ์ด ์ถฉ๋Œ์ฒด๊ฐ€ ์ถฉ๋Œ์„ ๋ง‰ ํ•œ ๊ฒƒ์ธ์ง€, ์ถฉ๋Œ ์ค‘์ธ๊ฑด์ง€, ์ถฉ๋Œ์ด ๋ง‰ ๋๋‚ฌ๋Š”์ง€์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

 

 

์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด์ „ ์ถฉ๋Œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ฃน ์•ˆ์— ์—ฌ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์ด ์˜ค๋ธŒ์ ํŠธ๋ผ๋ฆฌ์˜ ์กฐํ•ฉ์€ ์ˆ˜ ์—†์ด ๋งŽ๋‹ค. ์ด ์ˆ˜ ๋งŽ์€ ์กฐํ•ฉ์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๊ณ , ์ฐพ์„ ๋•Œ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์˜ฌ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ํƒ์ƒ‰์— ํŠนํ™”๋œ ์ž๋ฃŒ๊ตฌ์กฐ ํ•„์š”ํ•˜๋‹ค. - map, map๋ณด๋‹ค ๋น ๋ฅธ ํ•ด์‰ฌ ํ…Œ์ด๋ธ”, ์ด์ง„ํƒ์ƒ‰ํŠธ๋ฆฌ

 

ํƒ์ƒ‰ํ•˜๋ ค๋ฉด ํ‚ค๊ฐ€ ํ•„์š”ํ•จ - ์ด ๋‘ ์˜ค๋ธŒ์ ํŠธ ๊ฐ„์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ๊ณ ์œ ์˜ ํ‚ค๊ฐ€ ํ•„์š”ํ•˜๊ธฐ์— ์ถฉ๋Œ์ฒด์— ๊ณ ์œ ํ•œ id๋ถ€์—ฌ ํ•ด์•ผ ํ•œ๋‹ค.

// Collider.h
class Object;	// ์–˜๊ฐ€ ๋ˆ„๊ตฌ ์†Œ์†์ธ์ง€๋ฅผ ์•Œ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์˜ค๋ธŒ์ ํŠธ ํ•„์š”

class Collider	{
private:
	static UINT nextID;	// New!! ์ •์ ๋ฉค๋ฒ„๋กœ ๊ฐ์ฒด์— ํฌํ•จ X, ๋ฐ์ดํ„ฐ์— ๊ณ„์† ์‚ด์•„์žˆ์Œ.

	Object* owner;	
	Vec2	offsetPos;
	Vec2	finalPos;

	Vec2	scale;		

	UINT	iID;		// New!! ์ถฉ๋Œ์ฒด ๊ณ ์œ  ID

// ...
};


// Collider.cpp
UINT Collider::nextID = 0;

Collider::Collider()
	: owner(nullptr)
	, iID(nextID++)	
{
}

 

 

์œ„์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋ฉด ์ถฉ๋Œ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ๊ณ ์œ ์˜ ID๊ฐ€ nextID๋กœ ๋ถ€์—ฌ๋œ๋‹ค. (์ •์  ๋ณ€์ˆ˜๋กœ data์˜์—ญ์—์„œ ์ฃฝ์ง€ ์•Š๋Š”๋‹ค)

๋‹ค์Œ ์‹œ๊ฐ„์— ์ด ์•„์ด๋””๋กœ ์ถฉ๋Œ์ฒด ์กฐํ•ฉ์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์ถฉ๋Œ์ฒด์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

 

 

์ฝ”๋“œ๋Š” ์•„๋ž˜์— ์žˆ๋‹ค.

https://github.com/MiyeongEom/GameBasic/commit/fff7fef9bfab9237311b7362632e420180b20e95

 

~ Coliider(2) · MiyeongEom/GameBasic@fff7fef

MiyeongEom committed Jun 8, 2024

github.com

 

 

 

 

 

'๐Ÿค“ Study > winAPI' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[winAPI 15] Event Manager  (1) 2024.06.10
[winAPI 14] Collider(3)  (1) 2024.06.09
[winAPI 12] Collider(1)  (0) 2024.06.06
[winAPI 11] Resource Manager  (0) 2024.06.06
[winAPI 10] Resource & Path Manager  (1) 2024.06.06