2014-08-30 54 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); 
     } 
    } 

但是这有明显的限制,方向和角度之间没有联系。

我知道的是,有一个函数用某种方式使用切线比来计算你所面对的象限,并给你一些数字来调整位置。但是我不知道这个功能,也不知道如何正确使用它。

我希望能够做到的是当我按下UP时向箭头方向移动,向后按DOWN时向后移动。并左右左右摆动。 A和D键用于转动角度。

任何有用的算法,你可能知道将不胜感激。

编辑:Angle(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); 
    } 
} 

欲了解更多信息,从角度转换为X,Y坐标,看到这个页面http://www.mathsisfun.com/polar-cartesian-coordinates.html(向下滚动到“从极地转换为笛卡尔”),或谷歌“转换极性笛卡尔。”

2

您应该阅读有关更改坐标系的信息。 添加一个答案,因为我没有50个声望点可以添加这个评论。

+0

upvoted给你一些声誉;) – 2014-09-01 12:43:27

+0

感谢这个privilige。 :) – Crusher 2014-09-02 10:54:29

0

从我所看到的,问题是你将你的strafe代码与你的方向代码结合起来。这两者应该是分开的。对于扫射,你所要做的就是将你的速度乘以单位矢量。对于方向,将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; 
} 

这使用COS和罪恶从<cmath>所以预计将在弧度的说法。那么你只需要做player.position += player.velocity * deltaTime

+0

我目前的代码并不打算模拟上述的角度相关运动,它只是简单的向上/向下/向左/向右的45度能力。但我几乎没有向量的知识。我曾经希望能够编写一个简单地插入到if结构中的函数,将指向该位置的指针传递给函数并直接修改它们,或者用X_Co()和Y_Co()函数替换返回轴特定值。矢量做什么?使用载体有特定的优势吗? – Svihuroid 2014-08-30 21:16:06