OpenGL GLUT鼠标左键替代覆盖按住鼠标右键

时间:2019-05-11 19:22:27

标签: c++ opengl mouseevent glut

我正在调整一些框架代码以了解OpenGL的工作原理,并在SphericalCameraManipulator.cpp中使用它,这使我可以在按住鼠标右键的同时平移和倾斜摄像机:

void SphericalCameraManipulator::handleMouseMotion(int x, int y)
{
    //Motion
    float xMotion = (float)x - previousMousePosition[0];
    float yMotion = (float)y - previousMousePosition[1];

    if(reset)
    {
        xMotion = yMotion = 0.0;
        reset = false;
    }

    this->previousMousePosition[0] = (float)x;
    this->previousMousePosition[1] = (float)y;

    //Right Button Action
    if(this->currentButton == GLUT_RIGHT_BUTTON && this->currentState == GLUT_DOWN)
    {
        this->pan  -= xMotion*this->panTiltMouseStep ;
        this->tilt += yMotion*this->panTiltMouseStep ;
    }

    //Enforce Ranges
    this->enforceRanges();
} 

我删除了鼠标左键,因为我不希望它控制相机,现在它在主代码主体中执行命令。

//Left Button Action
if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN)
    {
        ...   //game action
    }

我的问题是,当我单击鼠标左键时,取消了鼠标右键的按下,并且必须释放并按下鼠标右键才能继续控制摄像机。

是否有防止这种情况发生的方法?它打断了游戏流程。我正在使用GLUT

1 个答案:

答案 0 :(得分:0)

Rabbid76的评论说没有鼠标按住事件将我设置在正确的路径上。

我写了一个小函数,简单地记录了鼠标按钮2(“相机环视”按钮)的最后状态:

void SphericalCameraManipulator::handleMouse(int button, int state)
{
    this->currentButton = button;
    this->currentState  = state;

    //to enable mouse look around
    if (this->currentButton == 2) //right mouse
        this->lastLookState = this->currentState;

    if(this->currentState == GLUT_UP)
    {
        reset = true;
    }
}

这意味着即使当前状态与鼠标左键有关(游戏动作),由于没有发生“鼠标两键向上”事件,仍然可以环顾四周:

this->currentButton = 2;
this->currentState  = 1;