7월, 2017의 게시물 표시

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번째씩 뒤로 밀루니 떨어지지 않고 잘 붙음. 또 다른 방법의 지렁이? 붙어는 있되 이동을 강제하지 않는 형태. 인터넷에 돌아다니는 각

원 충돌, 올드 페인팅(물체에 색입히기), 충돌 반사 각도 - 20170725

원과 원이 충돌했는지 확인하는 법 점과 점 사이의 길이를 잡은 다음, 각 원들의 반지름을 더한 값이 점과 점사이의 길이보다 짧다면 충돌한 셈이 되므로, struct Circle{ int x, y; // x,y 좌표 int length;} // 반지름 Circle c1, c2; 일때 sqrt(abs(c1.x - c2.x) * abs(c1.x - c2.x) + abs(c1.y - c2.y) * abs(c1.y - c2.y)) (abs(a)-> a 를 양수로 만든다. sqrt(a) -> a의 제곱근을 리턴한다.) 로 점대점 변의 길이를 구한 후, c1.length + c2.legnth 와 비교하면 됨. 원 충돌의 각도를 구하기.(GetAngle 유저 함수) 점과 점 사이의 각도가 얼만지 구하는 방식. 위에서 사용한 sqrt(abs(c1.x - c2.x) * abs(c1.x - c2.x) + abs(c1.y - c2.y) * abs(c1.y - c2.y)) 을 이용하면 대각길이를 구할 수 있음. 그럼 한 변과 해당 대각길이를 사용해 cos를 구하거나, 대각변 이외의 양 변을 이용해 탄젠트(tan)를 구할 수 있음. 그 경우, 구한 탄젠트(tan)를 이용해 각 각도에 적용시켜줌. 예를 들어 187도의 경우, 7도만 계산하고, 180도를 추가로 더해서 사용할 경우 프로그램에선 올바르게 나올 수 있음.(탄젠트는 PI = 3.14값을 90도로 사용하는것 같다.) 그 값을 진행방향값으로 주면 중심점으로부터 충돌한 곳까지의 각도로 다른 힘을 줄수 있다. <참고자료> http://wooriworld2006.tistory.com/186 - 원과 원이 충돌했는지 확인하는 법 http://blog.naver.com/PostView.nhn?blogId=pok_jadan&logNo=186906198 - 두 점 사이의 각도 및 좌표계, GetAngle 유저 함수. https://cboard.