Skip to content

02_11.CollisionDetection

jdeokkim edited this page May 6, 2022 · 4 revisions

충돌 감지의 개념

충돌 감지의 예시

우리가 게임을 제대로 만드려면 게임 세계의 캐릭터가 땅 또는 벽과 만나는지 확인하고, 캐릭터가 땅이나 벽을 뚫고 지나가지 않도록 캐릭터를 적절한 방향으로 밀어내야 한다. 여기서 게임 세계의 물체가 다른 물체와 충돌하는지를 확인하는 작업을 충돌 감지 (collision detection)라고 하고, 서로 충돌하는 두 물체를 적절한 방향으로 밀어내서 더 이상 충돌하지 않게 하는 작업을 충돌 해결 (collision resolution)이라고 한다.

raylib에서는 기본 도형 사이의 간단한 충돌 감지 함수는 제공하지만, 충돌 해결 함수는 따로 제공하지 않는다. 그렇기 때문에 게임 세계의 물체 사이의 충돌을 해결하는 함수는 우리가 직접 구현해야 한다. 이제 raylib가 제공하는 충돌 감지 함수들에 대해 한번 알아보자. raylib의 충돌 감지 함수들은 기본 도형 관련 함수들과 마찬가지로 raylib의 shapes 모듈 (rshapes.c)에 정의되어 있다.

// 직사각형 `rec1`과 `rec2` 사이의 충돌을 감지한다.
RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2);

// 중심점이 `center1`이고 반지름이 `radius1`인 원과, 중심점이 `center2`
// 이고 반지름이 `radius2`인 원 사이의 충돌을 감지한다.
RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2);

// 중심점이 `center`이고 반지름이 `radius`인 원과, 직사각형 `rec` 사이의
// 충돌을 감지한다.
RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec);

// 2차원 위치 `point`가 직사각형 `rec` 안에 있는지 확인한다.
RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec);

// 2차원 위치 `point`가 중심점이 `center`이고 반지름이 `radius`인 원 안에 
// 있는지 확인한다.
RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius);

간단한 예시를 통해 충돌 감지 함수를 어떻게 사용하는지 알아보자.

(추가 예정)