프로그래밍/공부

[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의 모습이 렌더링되게 된다.

 

 

 

이 사진과

 

이 사진을 본다면 객체가 가둬져서 나갈 수 없음을 확인할 수 있다.