2016-05-12 4 views
1

私はOpenGLアプリケーションでマウスのドラッグをキャプチャしようとしています。私は、これまでに以下のことをやった:GLFWを使用してマウスのドラッグをキャプチャしますか? [C++]

glfwSetMouseButtonCallback(window, mouse_callback); 

static void mouse_callback(GLFWwindow* window, int button, int action, int mods) 
{ 
    if (button == GLFW_MOUSE_BUTTON_LEFT) { 
     double x; 
     double y; 
     glfwGetCursorPos(window, &x, &y); 

     if (previous_y_position - y > 0) 
     { 
      camera_translation.y -= 1.0f; 
      previous_y_position = y; 
     } 
     else 
     { 
      camera_translation.y += 1.0f; 
      previous_y_position = y; 
     } 
    } 
} 

私は上向きに私のマウスを移動した後、繰り返しクリックする必要があり、ズームインしたい場合は、このかかわらに問題があります。何らかの理由で、マウスの左ボタンを押し下げて上にドラッグすると、何もしません。

+1

デバッガでコードをステップ実行しましたか?投稿したコードは、呼び出されて変数が更新されている限り、あなたが含まれていないコードに問題があります。これはあなたが[Minimal、Completed]を提供するためにインポートされた理由です。検証可能な例](http://stackoverflow.com/help/mcve)を参照してください。 –

答えて

2

mouse_callbackはステートレスです。イベント、瞬間的な「行動」を受け取ります。 マウスボタンが押されたことを「記憶」するようにプログラムを作成する必要があります。フレーム1でボタンを押すと、それ以降のすべてのフレームでこの情報を参照することができます。

簡単な方法は、プレス/リリースにブールフラグを反転することです:

概略的に
static void mouse_callback(GLFWwindow* window, int button, int action, int mods) 
{ 
    if (button == GLFW_MOUSE_BUTTON_LEFT) { 
     if(GLFW_PRESS == action) 
      lbutton_down = true; 
     else if(GLFW_RELEASE == action) 
      lbutton_down = false; 
    } 

    if(lbutton_down) { 
     // do your drag here 
    } 
} 

state     released    pressed    released 
timeline    -------------|------------------------------|--------------- 
           ^       ^
mouse_callback calls   GLFW_PRESS     GLFW_RELEASE 

ハードな方法は、あなたがより複雑に必要な場合は特に(ステート・マシンを使用することです入力コントローラの状態の組み合わせ)。

+0

それはうまくいきませんでした。 glfwGetCursorPosは、mouse_buttonが解放されるまで更新されないようです。 – Mettalknight

+0

どこに電話しますか? – Drop

+0

私はglfwSetMouseButtonCallback(window、mouse_callback)を呼び出します。 (glfwWindowShouldClose(window)) – Mettalknight

関連する問題