0. 개요
이전의 데모에서는 player 객체가 창 밖으로 나가거나, 몬스터 위를 지나가는 등의 동작이 가능했다.
코드를 추가하여 창 밖으로 나가지 못하게 하고, 몬스터와 닿으면 밀려나게 하는 것을 목적으로 한다.
1. Player와 창 사이의 충돌(Player.cpp)
게임의 해상도는 800*600으로 설정되어있다.
따라서 창의 왼쪽 끝은 x = 0, 위쪽 끝은 y = 0, 오른쪽 끝은 x = 800, 아래쪽 끝은 y = 600이다.
또한 직접 조작하여 움직이는 객체는 player에 해당하므로, Player.cpp의 Update 함수를 수정하도록 하겠다.
// 벽 바깥으로 이동할 수 없음
if (_pos.x < 0.f)
_pos.x += _stat.speed * deltaTime;
if (_pos.x > 800.f)
_pos.x -= _stat.speed * deltaTime;
if (_pos.y < 0.f)
_pos.y += _stat.speed * deltaTime;
if (_pos.y > 600.f)
_pos.y -= _stat.speed * deltaTime;
이제 벽 바깥을 나가고자 하면 거리 = 속도 * 시간의 공식을 따라 다시 안쪽으로 들어오게 되어
진행하고자 하는 속도 벡터와 다시 밀려나는 속도 벡터의 합이 0이 되어 움직이지 못하게 된다.
다만 위의 코드로 작성하면 player의 원 중앙이 판정 기준점이 되므로 추가적으로 보정을 해준다.
(player의 반경은 50px로 설정되어 있음)
또한 player가 상단의 UI 텍스트를 가리지 않도록 추가적으로 보정을 해주겠다.
// 벽 바깥으로 이동할 수 없음
// 좌측
if (_pos.x < 50.f)
_pos.x += _stat.speed * deltaTime;
// 우측
if (_pos.x > 750.f)
_pos.x -= _stat.speed * deltaTime;
// 상단
if (_pos.y < 80.f)
_pos.y += _stat.speed * deltaTime;
// 하단
if (_pos.y > 550.f)
_pos.y -= _stat.speed * deltaTime;
2. Player와 Monster 사이의 충돌 판정
Missile.cpp의 Missile과 Monster 사이의 충돌 판정 코드를 수정하여 사용한다.
// 몬스터와 충돌 판정
const vector<Object*>& objects = GET_SINGLE(ObjectManager)->GetObjects();
for (auto object : objects)
{
// objects 벡터를 순회하여 본인이면 스킵
if (object == this)
continue;
// 몬스터가 아니면 스킵
if (object->GetObjectType() != ObjectType::Monster)
continue;
// 플레이어 위치 p1
Pos p1 = GetPos();
// 몬스터의 위치 p2
Pos p2 = object->GetPos();
const float dx = p1.x - p2.x;
const float dy = p1.y - p2.y;
float dist = sqrt(dx * dx + dy * dy);
// 미사일과 몬스터 사이의 거리에 따라 충돌 판정함
// 우측
if (dist <= 75.f && dx > 0.f)
_pos.x += _stat.speed * deltaTime;
// 좌측
if (dist <= 75.f && dx <= 0.f)
_pos.x -= _stat.speed * deltaTime;
// 하단
if (dist <= 75.f && dy > 0.f)
_pos.y += _stat.speed * deltaTime;
// 상단
if (dist <= 75.f && dy <= 0.f)
_pos.y -= _stat.speed * deltaTime;
}
'Windows API & 게임 수학' 카테고리의 다른 글
2-2. 벡터를 이용한 기능 개선 - 유도탄 (0) | 2023.10.26 |
---|---|
2-1. 삼각함수를 이용하여 여러 각도로 발사하기 (1) | 2023.10.26 |
1-10. 번외 - 점수(Score) 구현하기 (0) | 2023.10.24 |
1-8. 리소스 제작 툴 만들기 (Resources, EditScene) (0) | 2023.10.17 |
1-7. 오브젝트(Object) 설계 (2) - 디버깅, 몬스터, 피격 판정 (0) | 2023.10.17 |