2012-03-03 16 views
0

指定された距離の角度で点Aから点Bへ移動する方法をインターネット上で調べ続けます。しかし、私はそれをコードしようとしたとき、カメラはちょうど混乱し、私はランダムな方向に移動しています。私はSDL/OpenGLをC++で使用しています。これが私のプレーヤー機能です。今、私は、アングルに沿って前進するようにプレーヤーを狙っています。私が正しいんだ場合player.rotxがあると思われるよう角度に相対的に移動するには?

void player_action() 
{ 

    if (SDL_PollEvent(&event)) 
    { 
     switch (event.type) 
     { 
      case SDL_MOUSEMOTION: 
       { 
        player.rotxl = (screen->w)/2; 
        player.rotxd = event.motion.x - player.rotxl; 
        player.rotx = player.rotx + (player.rotxd/4); 
        if (player.rotx < 0) 
        { 
         player.rotx = player.rotx + 360; 
        }; 
        if (player.rotx > 360) 
        { 
         player.rotx = player.rotx - 360; 
        } 
       }; 
      break; 

      case SDL_KEYDOWN: 
       switch (event.key.keysym.sym) 
       { 
        case SDLK_w: 
         {player.zvel = 8.0f;}; break; 
        case SDLK_a: 
         {player.xvel = 8.0f;}; break; 
        case SDLK_s: 
         {player.zvel = -8.0f;}; break; 
        case SDLK_d: 
         {player.xvel = -8.0f;}; break; 
        case SDLK_ESCAPE: 
         {running = false;}; break; 
        default: break; 

       }; break; 

      case SDL_KEYUP: 
       switch(event.key.keysym.sym) 
       { 
        case SDLK_w: 
         {player.zvel = 0.0f;}; break; 
        case SDLK_a: 
         {player.xvel = 0.0f;}; break; 
        case SDLK_s: 
         {player.zvel = 0.0f;}; break; 
        case SDLK_d: 
         {player.xvel = 0.0f;}; break; 
        default: break; 
       }; 
      break; 
     }; 

    }; 

    player.x = player.x + float(player.zvel*cos((double)player.rotx)); 
    player.z = player.z + float(player.zvel*sin((double)player.rotx)); 

    glRotatef(player.rotx, 0.0f, 1.0f, 0.0f); 
    glTranslatef(player.x, player.y, player.z); 

    SDL_WarpMouse((screen->w/2), (screen->h/2)); 
}; 
+0

あなたの変換が蓄積しないようにglRotatefとglTranslatefの周りにglPush()とglPop()が必要です。 –

答えて

1

は、数学関数sincos両方は、ラジアンでない度の角度を取ります。以下試してください:私たちは、pi/180player.rotxを乗算している

player.x = player.x + float(player.zvel*cos((double)player.rotx*0.0174532925)); 
player.z = player.z + float(player.zvel*sin((double)player.rotx*0.0174532925)); 

、我々は度をラジアンに変換する方法です。

これが唯一の問題であるかどうかはわかりませんが、確かにそのように思われます。私が見る問題の

+0

+1、あなたはちょうど私の問題を修正しました。私はそれが事実であることを知らなかった。 – Ripspace

+0

これは見逃しやすいことです(実際に私が2,3年前に自分のゲームの中で最初に同様の仕組みを実装したのと同じことでした)。うまく働いてくれてうれしいよ:) –

+0

問題を「修正」した後、WキーまたはAキーを押しても、カメラは常に左右に移動します。そこで、glRotate3fでは、最初の引数をplayer.rotx + 90に変更し、問題を修正しました。 – Ripspace

0

つの可能な供給源:

  1. 標準C++ cos/sin関数はラジアンの代わり度関数(1ラジアン= 180/PI度)を取ります。
  2. docsのSDLについてよく知りませんが、.xの代わりにevent.motion.xrelを使用する必要があると思います。画面幅を必要としない回転数の計算を変更する必要があります。
+0

いいえ。 2、私はOPが 'xrel'を手動で計算すると信じています:SDL_WarpMouse((screen-> w/2)、(screen-> h/2));'を使って 'event.motion.x - player.rotxl'このように動作するようにマウスを常に中央に置いておきます。しかし実際には、このメソッドと比較して 'event.motion.xrel'を使う方が簡単かもしれません –

関連する問題