winapi 지렁이 부드럽게 움직이는법 - 20170726

연속추적 지렁이(우리가 해야됬던쪽)

지렁이는 그냥 끝부분이 연결이 안끊기고 따라가는 쪽이 많지만, 기본적으로 우리가 해야됬던건 이전 위치를 그대로 답습하는 것이기 때문에 일단 서술함.

지렁이의 머리는 자기가 움직이고 싶은대로 움직일 수 있게 해야됨. 그런고로 이전 정보를 저장한 이후에 따라가면 가장 간단히 완성됨.
for (int i = 10; i >0; i--)
 {
   _bullet[i].x += _bullet[i - 1].x - _bullet[i].x;
   _bullet[i].y += _bullet[i - 1].y - _bullet[i].y;
}

이런 식으로 구성할 경우, 맨 앞(0번 지렁이 머리)을 제외하고 각각 이전 오브젝트보다  1틱씩 밀려서 생성하고 그대로 따라감.

근데 이걸로 문제가 있는게, 계속 바로 뒷순서로 가기 때문에 일정 간격을 줄수가 없음.

그러므로 간격을 주기 위해서 변형을 해야됨.

struct floatPoint // double형 POINT가 아닌 좀 짧은 형태로 재구성.
{
 float x;
 float y;
};

 floatPoint points[100];

해당 소스를 통해서 이전값을 저장할 수 있게 함.

 points[0] = { _bullet[0].x, _bullet[0].y };
 for (int i = 100; i > 0; i--)
 {
  points[i] = points[i - 1];
 }

그리고 이전값을 쫒아 저장하는 배열을 만들어, 내가 뒤로 밀고 싶은만큼 밀린 위치를 불러와 사용할 수 있도록 조절함.

   if (_bullet[i].fire)
   {
    _bullet[i].x = points[i * 10 - 1].x;
    _bullet[i].y = points[i * 10 - 1].y;
   }

10번째씩 뒤로 밀루니 떨어지지 않고 잘 붙음.


또 다른 방법의 지렁이? 붙어는 있되 이동을 강제하지 않는 형태.


인터넷에 돌아다니는 각종 지렁이는 이 형태를 많이 씀. 메모리보단 연산에 치중한것처럼 보이기 때문에 삼각함수를 알고있다면 이 방법이 더 접근하기 편해보였음.

우선, 각 개체간의 거리를 체크하고 그 거리에서 벗어날 경우 자기 이전의 지렁이 연결점의 값으로 간격을 유지하도록 이동하는 방법임.

if(sqrtf((_bullet[i].x - _bullet[i - 1].x) * (_bullet[i].x - _bullet[i - 1].x)
    + (_bullet[i].y - _bullet[i - 1].y) * (_bullet[i].y - _bullet[i - 1].y)) > (_bullet[i].radius * 1.5f))
   {
    _bullet[i].angle = atan2(-1 * (_bullet[i - 1].y - _bullet[i].y), (_bullet[i - 1].x - _bullet[i].x));
    _bullet[i].x += cosf(_bullet[i].angle) * _bullet[i].speed;
    _bullet[i].y += -sinf(_bullet[i].angle) * _bullet[i].speed;
   }

원의 1.5배 정도를 책정하여 지름인 2배보단 좀더 붙어있도록 설정했고, atan을 이용하여 각도를 구한 후, 그만큼 움직여주는 소스는 이전 소스와 동일하게 적용하였음.



<참고자료>


http://wer3799.tistory.com/12 - atan2 를 이용한 지렁이

댓글

이 블로그의 인기 게시물

[Unity2018.3.0f2] 코루틴 - 유니티에서 While문 멈추지 않고 돌리기.

[Unreal 4.20] 애니메이션 블루프린트에 캐릭터 가져오기.

[Unreal] AnimNotify 애님 노티파이 시스템.