๊ฐค๋ฌ๊ทธ ๊ฐ์ ๊ฒ์์์์ ํ๋ ์ด์ด ์ถฉ๋ ๋ฐ์ค๋ ๋ณดํต ์์ชฝ์ผ๋ก ๋์ด, ๋ฏธ์ฌ์ผ์ด ๋ ๋ผ์๋ ํผํ ์ ์๊ฒ ๊ตฌํ๋๊ธฐ ๋๋ฌธ์ ์๋์ ์ฌ์ง๊ฐ์ด ์์ ํ๋๋ก ํ๊ฒ ๋ค. ์ถ๊ฐ๋ก ๋ชฌ์คํฐ์๋ ์ถฉ๋ ๋ฐ์ค๋ฅผ ๊ทธ๋ฆฌ๋ ์์ ์ ์งํํ์๋ค.
// 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 |