2014-08-30 51 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