프로그래밍/공부
[Game] 객체 가두기
Sik.K
2023. 1. 17. 16:48
그런 상황이 있다. 상자 내부에서만 움직이는 객체, 특정 필드 밖으로 벗어날 수 없는 상황.
그런 상황에서는 어떤 식으로 코드를 짜면 좋을까?
해답은 간단하다.
이동 후, 해당 객체가 지정된 범위를 벗어났다면 그 객체의 위치를 다시금 안으로 고정시키면 된다.
if (rc->Intersect(target))
{
Vector2 dis = rc->GetWorldPos() - cc->GetWorldPos();
cc->MoveWorldPos(dis);
cc->Update();
//cout << cc->GetWorldPos().x << " " << cc->GetWorldPos().y << endl;
float x, y;
x = cc->GetWorldPos().x;
y = cc->GetWorldPos().y;
cout << x << " " << y << endl;
cc->SetWorldPosX(Utility::Saturate(x, -100.0f, 100.0f));
cc->SetWorldPosY(Utility::Saturate(y, -100.0f, 100.0f));
}
else
{
}
cc->Update();
이전에 작성해둔 코드의 일부분을 발췌하여 가져왔다.
Intersect는 특정 객체 간의 충돌을 감지하는 함수이다. 이를 통해 객체 target과 rc가 충돌을 했는지를 검사하고, 충돌을 했다면 조건문 내부의 코드를 수행한다.
충돌을 한 뒤, cc라는 원형 객체는 rc의 중점을 향해서 움직이게 되어 있다. 하지만 그냥 움직인다면 바로 rc의 중점으로 이동할 것이다.
이 객체의 행동을 제한하기 위해 Saturate라는 함수를 통해 해당 객체의 좌표가 -100.0f 작다면 -100.0f으로, 100.0f 보다 크다면 100.0f으로 고정하게 해준다.
하지만, 여기서 주의해야 할 점은 저기 cc->GetWorldPos()라는 함수는 cc.Update()로 갱신되는 cc의 행렬에서 가져오는 것이기 때문에 cc가 움직이고 나서 한 번 업데이트를 해주어야 정확한 값을 받아온다.
또한 조건문을 벗어난 뒤에 또 한 번, cc를 업데이트 해줘야 좌표가 제한된 cc의 모습이 렌더링되게 된다.
이 사진과
이 사진을 본다면 객체가 가둬져서 나갈 수 없음을 확인할 수 있다.