2014-08-30 2 views
0

2D지도를 이동하는 방법을 배우고 있으며 삼각법 기능 사용에 대한 도움이 필요합니다.특정 방향으로의 2D 이동

다음은 현재 코드입니다.

const Uint8 * key = SDL_GetKeyboardState(NULL); 
    if(key[SDL_SCANCODE_D]){ 
     if(render_arrow){ 
      arrow.Angle(1); 
     } 
    } 
    if(key[SDL_SCANCODE_A]){ 
     if(render_arrow){ 
      arrow.Angle(-1); 
     } 
    } 
    if(key[SDL_SCANCODE_LEFT]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co() - 1, arrow.Y_Co()); 
     } 
    } 
    if(key[SDL_SCANCODE_RIGHT]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co() + 1, arrow.Y_Co()); 
     } 
    } 
    if(key[SDL_SCANCODE_UP]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co(), arrow.Y_Co() - 1); 
     } 
    } 
    if(key[SDL_SCANCODE_DOWN]){ 
     if(render_arrow){ 
      arrow.set_location(arrow.X_Co(), arrow.Y_Co() + 1); 
     } 
    } 

그러나 이것은 방향과 각도 사이에 명확한 제한이 있으며 링크가 없습니다.

제가 알고있는 것은 어떻게 든 접하는 비율을 사용하여 직면하고있는 사분면을 계산하고 위치를 조정할 수있는 숫자를주는 함수가 있다는 것입니다. 그러나 나는 기능을 잘 알지 못한다.

내가 할 수 있기를 원하는 것은 위로를 누르면 화살표가 가리키는 방향으로 이동하고 아래를 누르면 뒤로 이동합니다. 그리고 왼쪽과 오른쪽으로 옆으로 치장하십시오. A 및 D 키는 각도를 전환하는 데 사용됩니다.

유용한 알고리즘을 알려 주시면 매우 감사하겠습니다.

편집 : 각도 (0)는 현재 각도를 반환합니다.

답변

1
if(key[SDL_SCANCODE_UP]){ 
    if(render_arrow){ 
     deltaX = AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * cos (arrow.angle()); 
     deltaY = AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * sin (arrow.angle()); 

     arrow.set_location(arrow.X_Co()+deltaX, arrow.Y_Co() +deltaY); 
    } 
} 
if(key[SDL_SCANCODE_DOWN]){ 
    if(render_arrow){ 
                   //Note the -'s 
     deltaX = - AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * cos (arrow.angle()); 
     deltaY = - AMOUNT_TO_MOVE_IN_FROM_ONE_KEYSTROKE * sin (arrow.angle()); 
     arrow.set_location(arrow.X_Co()+deltaX, arrow.Y_Co() +deltaY); 
    } 
} 

("직교 좌표로 극 변환하는 방법"으로 스크롤)이 페이지 http://www.mathsisfun.com/polar-cartesian-coordinates.html를 참조하거나 구글은 "극 직교 변환합니다."

2

좌표계 변경에 대해 읽어보십시오. 평판 포인트가 아직 없기 때문에 답변을 추가하고 아직 답변을 추가하지 않았습니다.

+0

당신에게 약간의 평판을주기 위해 upvoted;) –

+0

이 특권을 가져 주셔서 감사합니다. :) – Crusher

0

내가 볼 수 있듯이 문제는 사용자의 폭기 코드를 방향 코드와 결합하는 것입니다. 둘은 분리되어 있어야합니다. 스트레핑을하려면 단위 벡터로 속도를 곱하면됩니다. direction의 경우, Vector2 (cos 및 sin 구성 요소 포함)에 속도를 곱합니다.

// Our unit vectors 
namespace vec 
{ 
    Vector2f UpVec{0.0f, -1.0f}; 
    Vector2f DownVec{0.0f, 1.0f}; 
    Vector2f LeftVec{-1.0f, 0.0f}; 
    Vector2f RightVec{1.0f, 0.0f}; 
} 

if (Keyboard::isKeyPressed(Keyboard::Left)) 
{ 
    player.vel = player.speed * vec::LeftVec; 
} 
if (Keyboard::isKeyPressed(Keyboard::Right)) 
{ 
    player.vel = player.speed * vec::RightVec; 
} 

if (Keyboard::isKeyPressed(Keyboard::Up)) 
{ 
    float angle = player.angle * M_PI/180; 
    Vector2f dir{(float)cos(angle), (float)sin(angle)}; 
    player.vel = player.speed * dir; 
} 
if (Keyboard::isKeyPressed(Keyboard::Down)) 
{ 
    float angle = player.angle * M_PI/180; 
    Vector2f dir{-(float)cos(angle), -(float)sin(angle)};  
    player.vel = player.speed * dir; 
} 

<cmath>에서 왜냐하면 죄 사용은 그래서 라디안 될 수있는 인수를 기대 예를 들면 다음과 같습니다. 그런 다음 player.position += player.velocity * deltaTime을 입력하면됩니다. X Y 좌표 각도에서 변환하는 방법에 대한 자세한 내용은

+0

위의 설명 된 각도 의존 동작을 에뮬레이트하기위한 코드는 아닙니다. 위/아래/좌/우로 45도 기능 만 있으면됩니다. 그러나 나는 사실상 벡터에 대한 지식이 없다. 나는 단순히 if 구조체에 삽입 될 함수를 작성하여 함수에 대한 포인터를 전달하고 직접 수정하거나 함수를 반환하는 함수에 대해 X_Co() 및 Y_Co() 함수를 대체 할 수 있기를 기대했다. 축 특정 값. 벡터는 무엇을합니까? 벡터 사용에 특별한 이점이 있습니까? – Svihuroid