2012-03-03 38 views
0

我一直在互联网上查找如何从一个点到一个指定距离的角度B点。然而,当我试图编码它时,相机就会变得混乱起来,而且我正在随意移动。我正在用C++使用SDL/OpenGL,这是我的播放器功能。现在,我试图让玩家沿着角度前进。如何相对移动角度?

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(),以便您的转换不会累积起来。 – 2012-03-03 22:54:13

回答

1

如果我是正确的数学函数sincos都接受的角度弧度,度为player.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)); 

我们被pi/180乘以player.rotx,这是我们如何转换为弧度。

不知道这是你唯一的问题,但它肯定是其中之一。该问题的

+0

+1,你只是解决了我的问题。我不知道是这样。 – Ripspace 2012-03-03 23:51:26

+0

这很容易错过(事实上,当我几年前在我自己的游戏中首次实现类似的机制时,我也这么做了)。很高兴你得到它的工作:) – 2012-03-03 23:55:35

+0

我应该指出,“解决”问题后,如果我按下W或A键,相机总是会左右移动。所以,在glRotate3f中,我将第一个参数更改为player.rotx + 90,并解决了问题。 – Ripspace 2012-03-04 04:48:28

0

两个可能的源I看到:

  1. 标准C++ cos/sin功能采取的函数的弧度,而不是度(一个弧度= 180/PI度)。
  2. 虽然我不熟悉SDL,但快速查看docs让我觉得您应该使用event.motion.xrel而不是.x。你将不得不改变你的rotx计算,它不应该需要屏幕宽度。
+0

对于没有。 2,我相信OP在这里手动计算'xrel':'event.motion.x - player.rotxl',使用'SDL_WarpMouse((screen-> w/2),(screen-> h/2));'to保持鼠标中心不断,所以这个工程。但事实上,与此方法相比,使用'event.motion.xrel'可能会更简单 – 2012-03-03 23:52:12