2012-07-13 49 views
0

好吧,我正在directx9中製作一個簡單的攝像機運動程序。我從消息的輸入如下所示:C++輸入與WINAPI

 LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
    { 
     switch (uMsg) 
     { 
     case WM_KEYDOWN: 
      switch (wParam & 0x7F) 
      { 
       case 'W': 
        WDown = true; 
       case 'A': 
        ADown = true; 
       case 'S': 
        SDown = true; 
       case 'D': 
        DDown = true; 
      } 
     case WM_KEYUP: 
      switch (wParam & 0x7F) 
      { 

        case 'W': 
         WDown = false; 
        case 'A': 
         ADown = false; 
        case 'S': 
         SDown = false; 
        case 'D': 
         DDown = false; 
       } 
      } 
    } 

    // Render Frame code: 

    void Renderer::RenderOneFrame(bool w, bool a, bool s, bool d) 
    { 
    // Check Input 
     if(w) 
      m_camera.MoveForward(1); 
     else if(a) 
      m_camera.Strafe(-1); 
     else if(s) 
      m_camera.MoveForward(-1); 
     else if(d) 
      m_camera.Strafe(1); 
    } 

超級簡單的權利?儘管我遺漏了很多其他的代碼,但它並沒有混淆這些布爾值,所以它們不應該被需要。那麼,現在是這個問題。如果我使用這個代碼,它完美的工作。前進是前進,右邊是正確,左邊是左邊,後面是回來。

問題是,我想能夠對角移動。所以,明顯的答案是擺脫其他權利?那麼我呢。

但是,程序變得混亂!前進不前進!它不會做一件事!左轉倒退向右轉!唯一正確的是正確的!這恰巧是最後一次輸入檢查!但我一次只按1個鍵,但他們仍然壞了!發生了什麼?我打破了視覺工作室嗎?這個程序是否泄漏到另一個維度?到底是怎麼回事?!?

+0

您沒有任何'在你的交換機break'語句。由於保留了訂單,如果是這樣,我不會感到驚訝。另外,AFAIK,'wParam&0x7F'是不必要的。只是'wParam'好。 – chris 2012-07-13 02:15:30

+0

YUP THATS IT。感謝您的快速解決方案和信息! – wokparty 2012-07-13 02:19:54

回答

6

你忘記開關盒上的「斷開」了嗎?

例子:

LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uMsg) 
    { 
    case WM_KEYDOWN: 
     switch (wParam & 0x7F) 
     { 
      case 'W': 
       WDown = true; 
       break; 
      case 'A': 
       ADown = true; 
       break; 
      case 'S': 
       SDown = true; 
       break; 
      case 'D': 
       DDown = true; 
       break; 
     } 
     break; 
    case WM_KEYUP: 
     switch (wParam & 0x7F) 
     { 

       case 'W': 
        WDown = false; 
        break; 
       case 'A': 
        ADown = false; 
        break; 
       case 'S': 
        SDown = false; 
        break; 
       case 'D': 
        DDown = false; 
        break; 
      } 
     } 
     break; 
} 

// Render Frame code: 

void Renderer::RenderOneFrame(bool w, bool a, bool s, bool d) 
{ 
// Check Input 
    if(w) 
     m_camera.MoveForward(1); 
    if(a) 
     m_camera.Strafe(-1); 
    if(s) 
     m_camera.MoveForward(-1); 
    if(d) 
     m_camera.Strafe(1); 
} 
+0

爲了說明這一點,我將在幾個例子中加入一些例子,當某些按鍵被按下時和不用'else'時會發生什麼。它可以很容易地看到*爲什麼會出現這種情況。不過,這是我的看法。 – chris 2012-07-13 02:19:51