안녕하세요 선후 입니다^^
캐릭터를 이동시킬려고 하는데요 어렵네요 ㅠㅠ OTL 털썩
캐릭터의 위치가 x1= 100, y1 = 100 에 있는데요
목표가 x2 = 300, y2 = 200 입니다.
속도는 3 이라고 했을 때
프레임마다 속도 3으로 일정하게 X, Y에 값을 추가해야지 캐릭터가 목표지점으로 이동하쟎아요 ?
이떄 x1 과 y1 에 각각 한틱마다 추가되어야 하는 값을 어떻게 구할 수 있는지 궁금합니다.
ㅠㅠ 어렵습니다

음...int형을 쓰신듯, float형으로 좌표 계산을 해서 출력할때만 int형으로 변환해서 쓰면 되지 않나요?...대부분의 게임 엔진에서 좌표값을 처리하는 x, y가 float형인 것도 이 같은 이유에서죠.
일단 '틱' 이 발생하는 간격이 중요합니다.
만약 3pixel/초 라는 속도로 이동하는데
'틱'이 0.5초마다 한번씩 발생한다면 1.5pixel/틱(0.5초) 이동하면 3pixel/초가 되겠죠...
그런데 '틱'이 아마도 간격이 일정하지 않을것이므로
앞서 일어났던 시간과 현재시간으로 간격을 재서 그만큼의 배율만큼 이동하면됩니다.
v = d/s (v는 속도, d는 거리, s는 시간)이므로 식을 적당히 응용해서 구하시면 됩니다.
비례식처럼 하셔도 되구요.. 어차피 최종 속도는 같은 것이므로
d1:s1 = d2:s2 로 하시면 됩니다.
제가 들어드린 예로 말씀드리면
d1 = 3pixel, s1 = 1초, s2 = (시간간격)을 가지고 d2를 구하시면 됩니다.
그리고 위처럼 이동 거리를 구했다면
방향을 가지고 X, Y 각각의 값을 구해야겠죠?
x = rCos(theta)
y= rSin(theta)
r은 앞서 구한 거리입니다. (절대값으로 하세요.... 삼각함수에서 부호가 나옵니다.)
theta는 Math.atan2(dy, dx)로 쉽게 구할수 있습니다.
dy는 원래 좌표와 목표 좌표의 y좌표 편차.. (목표y에서 원래y를 빼시면 됩니다.)
dx는 원래 좌표와 목표 좌표의 x좌표 편차.. (목표x에서 원래x를 빼시면 됩니다.)
이렇게 구할수 있습니다.
모든 연산은 float으로 합니다. int로 할경우 오차가 커져서 이동시 덜컹 거리는 느낌을 줍니다.
현재위치 float cur_x, cur_y , 목표점 float target_x, target_y;
float nx = target_x - cur_x;
float ny = target_y - cur_y;
nx, ny 는 크기를 가진 목표점까지의 방향과 크기를 가진 벡터가 됩니다.
float d = (float)sqrt(nx * nx + ny * ny)
d 는 목표점까지의 거리(스칼라)값이 됩니다.
nx = nx / d;
ny = ny / d;
이제 nx, ny는 단위 벡터가 되었습니다.
즉, 방향성만 가진 벡터입니다. 거리는 여전히 d가 가지고 있습니다.
이제 실제 프레임 동안 이동할 거리만 구하면 되겠군요.
시간관계에 의한 이동 거리를 구해야 되겠지만 선후님은 프레임당 3을 가기를 원했으니 실제 이동할 거리는
float move_x = nx * 3.0f;
float move_y = ny * 3.0f;
즉 현재의 좌표에 move_x , move_y 를 더해주면 되겠습니다.
더 궁금하신 것은 수학의 정석 벡터편을 참조하시면 됩니다.




속도 3의 의미가 3pixel을 의미하는건가요?
(x2-x1) 하시면 200이 나오니까
200/3 = 67.xxx가 나오겠네요
68회 이동하면 300에 도달하겠네요
마찬가지로 (y2-y1)/3 회 이동하시면 될듯??
근데 질문을 사실 잘 이해를 못하겠네요;