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;
	}