์์ :)
https://github.com/eazuooz/WindowAPI/commit/5a78f083e6fdf77aadc65469df0d379a68215599
Collision manger 2 · eazuooz/WindowAPI@5a78f08
Show file tree Showing 16 changed files with 149 additions and 35 deletions.
github.com
์ ์ฅ๊น์ง์์ ์ฐ๋ฆฌ๋ ์ถฉ๋์ฒด๋ฅผ ๊ตฌํํ๋ค.
๊ทธ๋ผ ๊ฐ๊ฐ์ ์ ์๋ ์ถฉ๋์ฒด๋ก ์ด๋ป๊ฒ ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ค๊ฒ์ธ๊ฐ?
์ถฉ๋์ฒ๋ฆฌ๋ฅผ ๋์์ค CollisionManager๋ฅผ ์ ์ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
class Scene;
class Collider;
class CollisionManager
{
public:
static void Tick();
static void LayerCollision(Scene* scene, eColliderLayer left, eColliderLayer right);
static void ColliderCollision(Collider* left, Collider* right);
static bool Intersect(Collider* left, Collider* right);
static void clear();
static void SetLayer(eColliderLayer left, eColliderLayer right, bool value);
private:
static WORD mMatrix[_COLLIDER_LAYER];
static std::map<UINT64, bool> mCollisionInfomations;
};
์ผ๋จ ์ด๋ค ์ถฉ๋์ฒด ๋ผ๋ฆฌ ์ถฉ๋์ ํด์ค์ผ ํ ์ง ์ ์ํ๊ธฐ ์ํด์ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ฒ ๋ค.
์๋ฅผ๋ค์ด Player 1๋ฒ ๊ณผ Monster 3๋ฒ์ด ์ถฉ๋์ ์๋ก ํด์ผํ๋ ์กด์ฌ๋ผ๋ฉด
๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด ํ์ํ๋ ๊ฒ์ด๋ค.
1 | 2 | 3 | 4 | 5 | 6 | |
1 | true | true | ||||
2 | true | true | true | true | ||
3 | true | true | ||||
4 | true | true | ||||
5 | true | true | ||||
6 | true |
๊ทธ๋ฆฌ๊ณ ๋ํ ์์ธํ๋ณด๋ฉด 1,3 ๊ณผ 3,1 ์ด ๊ฒฐ๋ก ์ ์ผ๋ก ๋๋ค ๊ฐ์ ์ถฉ๋์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์
๋ค์๊ณผ ๊ฐ์ ์ฐ์ฐ์ผ๋ก ๋์์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ ์์ ์ซ์๋ฅผ row ์ชฝ์ผ๋ก ์ฌ์ฉํ์ฌ
ํ์ชฝ์๋ง ํ์ํด์ฃผ๊ธฐ๋ก ํ๊ฒ ๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก๋ ๋๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ํ์ชฝ๋ง ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉ๋ ๊ฒ์ด๋ค.
void CollisionManager::SetLayer(eColliderLayer left, eColliderLayer right, bool value)
{
// ๋ ์์ ์ซ์๋ฅผ ํ(๋ฐฐ์ด์ ์ธ๋ฑ์ค)์ผ๋ก, ๋ ํฐ ์ซ์๋ฅผ ์ด(๋นํธ ์์น)๋ก
UINT row = 0;
UINT col = 0;
UINT iLeft = (UINT)left;
UINT iRight = (UINT)right;
if (iLeft <= iRight)
{
row = (UINT)iLeft;
col = (UINT)iRight;
}
else
{
row = (UINT)iRight;
col = (UINT)iLeft;
}
if (value == true)
mMatrix[row] |= (1 << col);
else
mMatrix[row] &= ~(1 << col);
}
๊ทธ๋ฆฌ๊ณ ๋์ ๋งคํ๋ ์๋ง๋ค ํด๋น ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ์ํ ํ๋ฉด์ ์ถฉ๋์ฒด๋ฅผ ๋น๊ตํด์ค๋ค.
void CollisionManager::Tick()
{
Scene* scene = SceneManager::GetPlayScene();
for (UINT row = 0; row < _COLLIDER_LAYER; row++)
{
for (UINT col = row; col < _COLLIDER_LAYER; col++)
{
if (mMatrix[row] & (1 << col))
{
LayerCollision(scene, (eColliderLayer)row, (eColliderLayer)col);
}
}
}
}
์ด์ ๊ฐ ๋ ์ด์ด์ ์ถ๊ฐ๋ ์ค๋ธ์ ํธ๋ค์ ์ ๋ถ ๋ถ๋ฌ์์ ๊ฐ์ ์ถฉ๋์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค.
์๋ก ๊ฐ์ ์ค๋ธ์ ํธ์ด๊ฑฐ๋ ๊ฐ์ ๋ ์ด์ด๋ผ๋ฆฌ์ ์ถฉ๋์ด๋ผ๋ฉด ์ถฉ๋์ฐ์ฐ์ด 2๋ฒ์ผ์ด๋๊ธฐ ๋๋ฌธ์
ํ๋ฒ๋ง ์ถฉ๋ํด์ฃผ๋ ์์ธ์ฒ๋ฆฌ๊ฐ ์ถ๊ฐ ๋์ด์๋ค.
void CollisionManager::LayerCollision(Scene* scene, eColliderLayer leftLayer, eColliderLayer rightLayer)
{
const std::vector<Object*>& lefts = scene->GetObjects(leftLayer);
const std::vector<Object*>& rights = scene->GetObjects(rightLayer);
for (auto leftObject : lefts)
{
if (leftObject->GetCollider() == nullptr)
continue;
for (auto rightObject : rights)
{
if (rightObject->GetCollider() == nullptr)
continue;
if (rightObject == leftObject)
continue;
ColliderCollision(leftObject->GetCollider(), rightObject->GetCollider());
}
if (leftLayer == rightLayer)
break;
}
}
๊ทธ ์ธ ์กฐ๊ฑด๋ค์ ๋ชจ๋ ์ ์ฒ๋ฆฌํ๋ค๋ฉด ์ถฉ๋์ฒดํฌ๋ฅผ ์งํํด์ฃผ๋ฉด ๋๋ค.
InterSectํจ์๋ก ์ค์ ์ถฉ๋์ฒ๋ฆฌ๋ฅผ ํํ์ ์ถฉ๋ ๋์๋ค๋ฉด
์ต์ด ์ถฉ๋ ๋์์๋๋ OnCollisionEnterํจ์
์ถฉ๋์ค์ผ๋๋ OnCollisionStayํจ์
๊ทธ๋ฆฌ๊ณ ์ถฉ๋์ค์ธ ๋ฌผ์ฒด๊ฐ ์๋ก๋ฅผ ๋น ์ ธ๋์์๋๋ OnColllisionExitํจ์๋ฅผ ํธ์ถํด์ค๋ค.
void CollisionManager::ColliderCollision(Collider* left, Collider* right)
{
// ๋ ์ถฉ๋์ฒด์ ID ํ์ธ
ColliderID id;
id.left = left->GetID();
id.right = right->GetID();
// ์ด์ ์ถฉ๋์ ๋ณด๋ฅผ ๊ฒ์ํ๋ค.
std::map<UINT64, bool>::iterator iter
= mCollisionInfomations.find(id.ID);
// ์ถฉ๋์ ๋ณด๊ฐ ์๋ค๋ฉด ์ถฉ๋์ ๋ณด๋ฅผ ๋ง๋ค์ด์ค๋ค.
if (iter == mCollisionInfomations.end())
{
mCollisionInfomations.insert(std::make_pair(id.ID, false));
iter = mCollisionInfomations.find(id.ID);
}
if (Intersect(left, right))
{
// ์ถฉ๋ ์ค
if (iter->second == false)
{
//์ต์ด ์ถฉ๋ํ์๋
left->OnCollisionEnter(right);
right->OnCollisionEnter(left);
iter->second = true;
}
else
{
//์ถฉ๋ ์ค์ผ๋
left->OnCollisionStay(right);
right->OnCollisionStay(left);
}
}
else
{
// ์ถฉ๋ X
if (iter->second)
{
left->OnCollisionExit(right);
right->OnCollisionExit(left);
iter->second = false;
}
}
}
InterSectํจ์์์๋ ์ถฉ๋์ฒด (๋ค๋ชจ , ๋๊ทธ๋ผ๋ฏธ ๋ฑ๋ฑ) ๋ฌผ์ฒด๋ง๋ค ์๋ง์ ์ถฉ๋์ฒดํฌ๋ฅผ ์งํํด์ฃผ๋ฉด ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ตฌํํ ๋ค๋ชจ/๋ค๋ชจ ์ถฉ๋์ ๋ํด์ ๊ฐ๋ตํ๊ฒ ์ค๋ช ํ๊ฒ ๋ค.
y ๊ฐ์ ๋ํ ํ๋จ
- A์ top์ด B์ bottom๋ณด๋ค ์๋ค.
- B์ top์ด A์ bottom๋ณด๋ค ์๋ค.
x ๊ฐ์ ๋ํ ํ๋จ
- A์ left๊ฐ B์ right๋ณด๋ค ์๋ค
- B์ left๊ฐ A์ right๋ณด๋ค ์๋ค.
์ 4๊ฐ์ ์กฐ๊ฑด์ด ๋ชจ๋ ๋์์ ๋ง์กฑํด์ผ ๋ ์ค๋ธ์ ํธ๊ฐ ๊ฒน์น๋ ๊ฒ ๋๋ ๋ง๋๋ ๊ฒ์ด ๋๋ค.
'๐ Development Study > ๐ป Win32API' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Alphablend, Camera Effect (0) | 2022.10.05 |
---|---|
Camera (1) | 2022.10.04 |
Collider (0) | 2022.09.27 |
Component (0) | 2022.09.26 |
Path, Resource Load (1) | 2022.09.22 |
๋๊ธ